定义:为某对象提供一个代理以控制对该对象的访问。此时,访问对象不适合或不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。(代理对象还可以扩展目标对象的功能)
优点:
代理模式在客户端和目标对象之间起到一个中介作用和保护目标对象的作用
代理对象可以扩展目标对象的功能
代理模式将客户端和目标对象分离,在一定程度上降低了系统耦合度,增加了程序的可扩展性
抽象主题类(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法
真实主题类(RealSubject):实现了抽象主题中的具体业务,作为被代理对象
代理类(Proxy):持有真实主题的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。可以访问、控制或扩展真实主题的功能。作为代理对象
根据编码方式可以分为静态代理和动态代理
静态代理:由程序员创建代理类再对其编译,程序运行前代理类的 .class 文件就已经生成
动态代理:在程序运行时,应用反射机制动态创建代理对象
根据使用范围进行分类
远程代理:为一个对象在不同的地址空间提供局部代表,这样系统可以将server部分的实现隐藏
虚拟代理:使用一个代理对象表示一个十分耗费资源的对象,在真正需要的时候才创建
安全代理:用来控制真实对象访问时的权限,一般用于真实对象有不同的访问权限时
智能指引:当调用真实的对象时,代理处理另外一些事
//抽象主题 interface Subject { public void request(); }
//真实主题 class RealSubject implements Subject { public void request() { System.out.println("访问真实主题方法"); } }
//代理 class Proxy implements Subject { private RealSubject realSubject; public void request() { if (realSubject == null) { realSubject = new RealSubject(); } preRequest(); realSubject.request(); postRequest(); } public void preRequest() { System.out.println("访问真实主题之前的预处理"); } public void postRequest() { System.out.println("访问真实主题之后的后续处理"); } }
原文:https://www.cnblogs.com/tang321/p/14676164.html