代理模式是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。 ,,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。
本文目录导读:
代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问,这种模式主要分为静态代理和动态代理,静态代理是在编译时就确定了代理类和被代理类的关系,而动态代理是在运行时动态生成代理类,本文将对代理模式进行详细解析,并通过实际案例来演示如何运用代理模式解决实际问题。
代理模式的定义
代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问,这种模式主要分为静态代理和动态代理,静态代理是在编译时就确定了代理类和被代理类的关系,而动态代理是在运行时动态生成代理类。
代理模式的作用
1、控制对原对象的访问:通过代理对象可以控制对原对象的访问,例如实现权限控制、缓存等功能。
2、延迟加载:代理模式可以在需要时才创建代理对象,从而实现延迟加载,节省系统资源。
3、解耦:将原本直接关联的对象解耦,使得它们之间的关系更加清晰。
4、代码复用:通过代理模式可以实现代码的复用,减少重复代码的编写。
代理模式的实现方式
1、静态代理:在编译时就确定了代理类和被代理类的关系,通常使用接口来定义。
// 定义接口 public interface Subject { void request(); } // 实现类A public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: Handling request."); } } // 实现类B,作为RealSubject的代理 public class ProxySubject implements Subject { private RealSubject realSubject; @Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); } preRequest(); realSubject.request(); postRequest(); } private void preRequest() { System.out.println("ProxySubject: Pre-processing before forwarding the request to RealSubject."); } private void postRequest() { System.out.println("ProxySubject: Post-processing after forwarding the response from RealSubject."); } }
2、动态代理:在运行时动态生成代理类,通常使用Java的反射机制来实现。
// 定义接口 public interface Subject { void request(); } // 实现类A,作为RealSubject的实现类 public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: Handling request."); } } // 实现动态代理类DynamicProxyHandler,用于生成ProxySubject实例 public class DynamicProxyHandler implements InvocationHandler { private Object target; public DynamicProxyHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("DynamicProxyHandler: Pre-processing before forwarding the request to target object."); Object result = method.invoke(target, args); System.out.println("DynamicProxyHandler: Post-processing after forwarding the response from target object."); return result; } }
四、实战应用:使用代理模式实现一个简单的计算器功能,包括加法、减法、乘法和除法。