Proxy Pattern

1. 什么是代理模式

代理模式: 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
Proxy Pattern: Provide a surrogate or placeholder for another object to control access to it.
代理模式是一种对象结构型模式。

在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。

主要解决的问题是:在直接访问对象时带来的问题。

2. 代理模式类角色解析

代理模式结构图:

为了让客户端能够一致性地对待真实对象和代理对象,在代理模式中引入了抽象层。

  • Subject(抽象主题角色) 它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
  • Proxy(代理主题角色): 它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。
    通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
  • RealSubject(真实主题角色): 它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。

3. 代理模式和装饰模式区别

代理模式和装饰模式非常类似,甚至代码都类似。二者最主要的区别是:代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,仅此而已。
代理模式和装饰模式的最大区别就是目的: 代理模式控制的是对象的访问控制,而装饰模式仅仅是装饰一下,增加一些功能。

4. 动态代理

代理的实现分为:

  1. 静态代理:代理类是在编译时就实现好的。也就是说 Java 编译完成后代理类是一个实际的 class 文件。
  2. 动态代理:代理类是在运行时生成的。也就是说 Java 编译完之后并没有实际的 class 文件,而是在运行时动态生成的类字节码,并加载到JVM中。

动态代理是指在运行时动态生成代理类。即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。与静态处理类相比,动态类有诸多好处。

  • 首先,不需要为Subject(抽象主题角色写一个形式上完全一样的封装类,如果主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦。
  • 如果接口有变动,则真实主题和代理类都要修改,不利于系统维护;
  • 使用一些动态代理的生成方法甚至可以在运行时制定代理类的执行逻辑,从而大大提升系统的灵活性。

更多请参考:
代理模式原理及实例讲解
代理模式及Java实现动态代理

5. 代理模式好处

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系 统的耦合度。
  • 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
  • 使用动态代理更加解耦

6. 一个很好的代理模式应用例子

图片代理:一个很常见的代理模式的应用实例就是对大图浏览的控制。
用户通过浏览器访问网页时先不加载真实的大图,而是通过代理对象的方法来进行处理,在代理对象的方法中,先使用一个线程向客户端浏览器加载一个小图片,然后在后台使用另一个线程来调用大图片的加载方法将大图片加载到客户端。当需要浏览大图片时,再将大图片在新网页中显示。如果用户在浏览大图时加载工作还没有完成,可以再启动一个线程来显示相应的提示信息。通过代理技术结合多线程编程将真实图片的加载放到后台来操作,不影响前台图片的浏览。

7. 代码示例

从以下示例可以看到动态代理确实很方便。

7.1 静态代理示例:

//Subject,抽象主题角色
public interface Subject {void request();
}//RealSubject,真实主题角色
public class RealSubject implements Subject {@Override public void request() {System.out.println("真正的request");}
}//Proxy(代理主题角色)
public class ProxySubject implements Subject {private Subject subject;//内部直接持有真正的Subject对象,对其进行访问控制。public ProxySubject() {subject = new RealSubject();}@Override public void request() {System.out.println("before====");subject.request();System.out.println("after====");}
}//测试类
public class MainClass {public static void main(String[] args) {Subject subject  = new ProxySubject();subject.request();}
}

7.2 动态代理示例:

//Subject,抽象主题角色
public interface Subject {void request();
}//RealSubject(真实主题角色)
public class RealSubject implements Subject {@Override public void request() {System.out.println("真正的request");}
}//ProxyHandler,动态代理Handler
public class ProxyHandler implements InvocationHandler {private Subject subject;//内部直接持有真正的Subject对象,对其进行访问控制。public ProxyHandler() {this.subject = new RealSubject();}@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before====");//调用真实Subject的方法Object invoke = method.invoke(subject, args);System.out.println("after====");return invoke;}
}//测试类
public class ZZMainClass {public static void main(String[] args) {Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[] {Subject.class}, new ProxyHandler());subject.request();
}
```java打印结果:before====真正的requestafter====

设计模式(十三) 代理模式和Java动态代理相关推荐

  1. 代理模式之Java动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 1. Overview Java在java.lang.reflect包下,定义了自己的代理.利用这个包下的类,我们可以在运行时 ...

  2. 【设计模式】代理模式之JDK动态代理与CGLIb代理区别

    一.什么是代理? 代理模式是Java中常见的一种模式,英文名字叫走Proxy或者Surrogate,代理的本意是一个人代表另一个人,或者一个机构代表另一个机构,采取行动,因而,代理和现实生活中的中介有 ...

  3. 代理模式之详谈动态代理模式(Spring的AOP实现)

    java动态代理实现与原理详细分析 1.代理模式 关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 代理 ...

  4. 代理模式及JDK动态代理(InvocationHandler)的简单实现与分析

    在慕课网上学习了讲解代理模式的一个课程--<模式的秘密--代理模式>,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理, ...

  5. 代理模式 、JDK动态代理、cglib动态代理

    代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢? 因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思. 再如我 ...

  6. 代理模式之jdk动态代理的实现

    学习动态代理之前需要了解静态代理 并且牢记静态代理的缺点 //首先被代理的类需要实现一个接口 public interface ProxyInterface {public void say(Stri ...

  7. 代理模式中的动态代理

    动态代理和静态对比基本思路是一致的,只不过动态代理功能更加强大,随着业务的扩展适应性更强.如果还以找对象为例,使用动态代理相当于是能够适应复杂的业务场景.不仅仅只是父亲给儿子找对象,如果找对象这项业务 ...

  8. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

  9. Java 动态代理详解 ( 附示例源码,建议收藏)

    动态代理在Java中有着广泛的应用,比如Spring AOP.Hibernate数据查询.测试框架的后端mock.RPC远程调用.Java注解对象获取.日志.用户鉴权.全局性异常处理.性能监控,甚至事 ...

最新文章

  1. 你真的了解你的手机?—麦克风降噪
  2. canal mysql多实例_canal搭建实例
  3. case when影响性能吗_端子台的性能受航空插头插针插孔的影响吗?
  4. 测试内存对齐对运行速度的影响
  5. Java基础学习总结(66)——配置管理库typesafe.config教程
  6. 挑选回文串(二进制枚举)
  7. toad可以连接mysql吗_配置Toad链接远程Oracle数据库
  8. C++ 模板实例化与调用
  9. 走进内存,走进汇编指令来看C/C++指针
  10. go 中的关于命令行格式的使用
  11. stata15中文乱码_如何解决 Stata 14 的中文乱码问题?Chinese support in Stata 14
  12. 天视通电脑版APP怎么添加录像机_手机怎么远程连接海康录像机,手把手教你、、、...
  13. 解析局域网即时通讯软件安全吗
  14. 显示器的bit是什么意思,8bit和10bit到底谁好
  15. 用R语言对网络数据进行统计分析(四)
  16. python编写程序解方程_第2章 Python初步 课后题
  17. 音频电解电容应用方法及经验
  18. Hinton努力推翻自己积累了30年的学术成果,我才知道什么叫生命力!
  19. matlab中使用ode方法解范德波尔微分方程的数值解
  20. 项目商业模式的设计与思考

热门文章

  1. 麻将--国标麻将番种图解 联众麻将规则图解
  2. 结构化数据和非结构化数据的分析
  3. python+pands+matplotlib分析Excel表格
  4. 面试准备:逻辑智力题
  5. C语言输入一个大写字母,输出金字塔打印字母
  6. 编写一个求x的n次方的函数
  7. 淘口令卡首屏直通车卡首屏关键词刷单技术分享
  8. NP 10抗菌肽是什么?有什么作用?
  9. 图像文件的读写和转换——BMP转YUV
  10. android监控app被杀死,Android App前后台监控