-
代理模式就是给一个对象提供了一个代理对象,并由代理对象控制对原对象的引用
-
起到了一个中介的作用,它连接客户端和目标对象
-
代理模式的UML图
-
subject:抽象角色,声明真实对象和代理对象的共同接口。proxy:代理角色,代理对象与真实对象实现相同的接口,所以它在任何时刻都能够代理真实对象,内部包含对真实对象的引用。realsubject真实角色,代表着真实的对象。
-
按照代理创建的时期进行分类,代理模式分为静态代理和动态代理:
-
静态代理
是有程序员创建或者特定工具自动生成源代码,再对其进行编译。在代码运行之前,代理类.class文件就已经被创建好了。需要为每个类都创建一个代理类,不易管理。
-
动态代理
在程序运行时通过反射机制动态创建的。大大加少了开发任务,同时加少了对业务接口的依赖,降低了耦合度。
-
-
静态代理的代码实现过程
-
创建一个抽象角色
/** * 抽象角色 */ public interface BuyHouse { void buyHouse(); }
-
创建具体角色
/** * 真实的具体角色 */ public class RealBuyHouseSubject implements BuyHouse { @Override public void buyHouse() { System.out.println("我要买房!"); } }
-
创建静态代理类(与具体角色实现相同的接口)
/** * 静态代理角色 */ public class BuyHouseProxy implements BuyHouse { //真实对象的引用 BuyHouse buyHouse; BuyHouseProxy(BuyHouse buyHouse){ this.buyHouse = buyHouse; } /** * 静态代理过程 */ @Override public void buyHouse() { buyHouse.buyHouse(); System.out.println("选择房源"); System.out.println("谈价钱"); System.out.println("支付购房款"); } }
-
编写静态代理测试类
public class StaticTest { public static void main(String[] args) { BuyHouseProxy buyHouseProxy = new BuyHouseProxy(new RealBuyHouseSubject()); buyHouseProxy.buyHouse(); } }
-
-
动态代理的代码实现
-
创建一个抽象角色
/** * 抽象角色 */ public interface BuyHouse { void buyHouse(); }
-
创建一个抽象角色的实现类(具体角色)
/** * 真实的具体角色 */ public class RealBuyHouseSubject implements BuyHouse { @Override public void buyHouse() { System.out.println("我要买房!"); } }
-
创建动态代理类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 1. 与静台代理类的不同之处:实现的接口不一样 * 2. 通过客户端的调用,可以将InvocationHandler反射称为BuyHouse接口 * 3. 通过反射机制进行代理类的创建,在客户端调用的时候才创建(在程序运行过程中动态代理) * 4. 动态代理类能够代理多种类型的类 */ public class DynamicBuyHouseProxy implements InvocationHandler { //代理类需要关联真实的角色类 Object object; public DynamicBuyHouseProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //通过反射调用具体的方法 //object调用具体的代理类 Object result = method.invoke(object, args); System.out.println("选择房源"); System.out.println("谈价钱"); System.out.println("支付购房款"); return result; } }
-
编写测试类
import com.kangswx.designmode.structure.proxy.BuyHouse; import com.kangswx.designmode.structure.proxy.RealBuyHouseSubject; import java.lang.reflect.Proxy; public class DynamicProxyTest { public static void main(String[] args) { BuyHouse buyHouse = new RealBuyHouseSubject(); BuyHouse proxy = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new Class[]{BuyHouse.class}, new DynamicBuyHouseProxy(buyHouse)); proxy.buyHouse(); } }
-
-
代理模式的优点
- 代理模式能够协调调用者与被调用者,降低了系统的耦合度
- 代理对象可以在客户端和目标对象之间起到中介的作用,起到了保护对象的作用。
-
代理模式的缺点
- 在客户端和真实对象之间增加了代理类,有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
-
代理模式的适用场景
-
远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
-
虚拟代理:通过一个小的对象代理一个大的对象,减少系统的开销。
-
保护代理:用来控制对真实对象的访问权限。
-
代理模式在JDK中的使用
设计模式--代理模式
最新推荐文章于 2024-10-04 19:09:21 发布