当前位置:首页 > CN2资讯 > 正文内容

【代理模式】静态代理,动态代理

2天前CN2资讯



文章目录

  • 代理模式
  • 静态代理模式
  • 1、介绍
  • 2、例子:婚介公司
  • 3、优点
  • 动态代理模式
  • 1、介绍
  • 2、例子:租房中介公司
  • 3、优点

代理模式

静态代理模式

1、介绍

1、真实角色和代理角色要实现同一个接口
2、代理角色要代理真实角色
3、给代理角色添加set方法(属性为接口,从而解耦合),将某个真实角色注入到代理角色的属性中,以便调用

2、例子:婚介公司

public class StaticProxyTest {
public static void main(String[] args) {
You you = new You();
WeddingCompany weddingCompany = new WeddingCompany();
weddingCompany.setMarry(you);
/*
这也是多线程Thread的原理
new Thread(一个实现Runnable接口的类).start(),而且Thread本身也实现了Runnable接口
*/

weddingCompany.HappyMarry();
}
}

interface Marry {
void HappyMarry();
}

//真实角色,你去结婚
class You implements Marry {
@Override
public void HappyMarry() {
System.out.println("Marry~");
}
}

//代理角色,帮你结婚
class WeddingCompany implements Marry {

private Marry target;

public void setMarry(Marry target) {
//传入真实角色
this.target = target;
}

@Override
public void HappyMarry() {
before();
this.target.HappyMarry(); //真实角色
after();
}

private void before() {
System.out.println("before--arrangement~");
}

private void after() {
System.out.println("after--clear~");
}
}

3、优点

代理角色可以做真实角色分外的事,从而真实角色专注做自己分内的事


动态代理模式

1、介绍

  • 动态代理的角色和静态代理的一样
  • 动态代理的代理类是动态生成的,静态代理的代理类是我们提前写好的
  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
    (1)基于接口的动态代理----JDK动态代理
    (2)基于类的动态代理----cglib
    (3)现在用的比较多的是 javasist 来生成动态代理 . 百度一下javasist

JDK的动态代理需要了解两个类:


  • InvocationHandler

  • Proxy

2、例子:租房中介公司

public class DynamicProxyTest {
public static void main(String[] args) {
//真实角色
Host host = new Host();

//代理实例的调用处理程序
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host); //将真实角色放置进去!
Rent proxy = (Rent)pih.getProxy(); //动态生成对应的代理类!
proxy.rent();
}
}

//接口
interface Rent {
public void rent();
}

//真实角色: 房东,房东要出租房子
class Host implements Rent{
public void rent() {
System.out.println("房屋出租");
}
}

//代理角色:中介
class ProxyInvocationHandler implements InvocationHandler {

private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}

//生成代理类,重点是第二个参数,获取要代理的抽象角色!之前都是一个角色,现在可以代理一类角色
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
rent.getClass().getInterfaces(),this);
}
// proxy : 代理类 method : 代理类的调用处理程序的方法对象.
// 处理代理实例上的方法调用并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
//核心:本质利用反射实现!
Object result = method.invoke(rent, args);
fare();
return result;
}
//看房
public void seeHouse(){
System.out.println("带房客看房");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
}


更有普适性的例子(优化了 ProxyInvocationHandler 类):

public class DynamicProxyTest {
public static void main(String[] args) {
//真实角色
Host host = new Host();

//代理角色
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(host); //将真实角色放置进去!
Rent proxy = (Rent)pih.getProxy(); //动态生成对应的代理类!
proxy.rent();
}
}

//接口
interface Rent {
public void rent();
}

//真实角色: 房东,房东要出租房子
class Host implements Rent{
public void rent() {
System.out.println("房屋出租");
}
}

//代理角色:中介
class ProxyInvocationHandler implements InvocationHandler {

private Object target;

public void setTarget(Object target) {
this.target = target;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
// proxy : 代理类
// method : 代理类的调用处理程序的方法对象.
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String methodName){
System.out.println("执行了"+methodName+"方法");
}
}

3、优点

(包含了静态代理的优点)

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情
  • 公共的业务由代理来完成 . 实现了业务的分工
  • 公共业务发生扩展时变得更加集中和方便
  • 一个动态代理 , 一般代理某一类业务
  • 一个动态代理可以代理多个类,代理的是接口

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23876.html

    分享给朋友:

    “【代理模式】静态代理,动态代理” 的相关文章

    如何高效购买服务器?全面指南助你轻松选择最佳配置

    在决定购买服务器之前,做好充分的准备是至关重要的。服务器的选择直接影响企业的运营效率和未来发展,因此我们需要从多个角度进行考量。 确定企业需求 企业的需求是选择服务器的核心依据。我们需要明确服务器的主要用途,比如是用于数据存储、网站托管,还是进行大规模计算。不同的应用场景对服务器的性能要求差异很大。...

    樱花VPS:高性价比的日本虚拟专用服务器推荐

    樱花VPS是一个由日本知名主机提供商Sakura Internet Inc.推出的虚拟专用服务器产品。在选择VPS时,用户常常关注服务的稳定性、速度和价格等方面,而樱花VPS正是在这些核心领域表现出色,吸引了一大批用户的关注。 首先,樱花VPS以其高性价比闻名。作为国内前三强的VPS提供商。其规模化...

    VPSCheap评测:低价VPS服务的最佳选择与性能分析

    VPSCheap的概述 我第一次听说VPSCheap的时候,是在一个热闹的VPS论坛上。这个成立于2010年的主机商,主要提供KVM型VPS服务,其特点是低价格和无限流量。从那以后,我对VPSCheap的关注逐渐加深。它的数据中心位于美国达拉斯,给不少用户带来了良好的使用体验。论坛上的用户在讨论各自...

    如何获取便宜稳定算力以推动科研与技术创新

    便宜稳定算力是一个现代计算资源获取的概念,特别是在人工智能、深度学习及科学计算等领域中,这种计算能力的经济性与可靠性显得尤为重要。它的定义可以简单理解为以相对较低的成本获得高效、稳定的计算资源。随着科技的迅速发展,企业和研究机构对计算资源的需求逐渐增加,如何以合理的投资实现算力购买成为一个值得关注的...

    VPS搭建:从选择提供商到后续管理的全面指南

    什么是VPS搭建? 了解VPS搭建的第一步是弄清楚VPS的定义。VPS,全称为虚拟专用服务器,是将一个物理服务器划分成多个独立的虚拟服务器。每个VPS都具有自己的操作系统和资源,能够像独立服务器一样运行各种应用程序。这种方式提供了更高的灵活性和可控性,相比共享主机来说,用户能够自主安装软件,配置环境...

    搬瓦工Plan v2:高性价比VPS套餐详解与用户指南

    搬瓦工Plan v2作为一个限量版VPS套餐,给很多用户带来了新的选择。与之前的The Plan套餐相比,Plan v2在配置与流量方面都实现了显著的提升。这款套餐不仅是一种实用的解决方案,也为不同需求的用户提供了灵活的选择。接下来,我将分享一些关于这个套餐的背景信息、主要升级点以及它适合哪些用户。...