代理模式的定义:
Provide a surrogate or placeholder for another object to control access to it.
为其他对象提供一种代理以控制对这个对象的访问。
摘抄的一些评论:
代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上代理人是要有当事人的授权,并且在核心问题上还需要请示当事人。
在软件设计中,使用代理模式的意图也很多,比如因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节 (如 RMI),也可能为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的。
代理模式通用类图:
代理模式角色分为 4 种:
- 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;
- 真实主题:真正实现业务逻辑的类;
- 代理类:用来代理和封装真实主题;
- Client:客户端,使用代理类和主题接口完成一些工作。
主题接口
1 package cn.rocker.designpattern.proxy; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 抽象主题类 7 * @date 2018/5/6 18:55 8 */ 9 public interface Subject { 10 //定义一个方法 11 void request(); 12 }
真实主题
1 package cn.rocker.designpattern.proxy; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 7 * @date 2018/5/6 19:00 8 */ 9 public class RealRequest implements Subject{ 10 @Override 11 //实现方法 12 public void request() { 13 //业务处理逻辑 14 System.out.println("i am the real object..."); 15 } 16 }
代理类
1 package cn.rocker.designpattern.proxy; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 7 * @date 2018/5/6 19:01 8 */ 9 public class Proxy implements Subject{ 10 11 private Subject subject = null; 12 public Proxy(Subject subject){ 13 this.subject = subject; 14 } 15 16 @Override 17 public void request() { 18 this.before(); 19 this.subject.request(); 20 this.after(); 21 } 22 23 private void before() { 24 //前处理 25 System.out.println("i am the preHandler of the object..."); 26 } 27 28 private void after() { 29 //后处理 30 System.out.println("i am the postHandler of the object..."); 31 } 32 }
客户端
1 package cn.rocker.designpattern.proxy; 2 3 import org.junit.Test; 4 5 /** 6 * @author rocker 7 * @version V1.0 8 * @Description: 9 * @date 2018/5/6 19:15 10 */ 11 public class Client { 12 @Test 13 public void test(){ 14 RealRequest realRequest = new RealRequest(); 15 Subject proxy = new Proxy(realRequest); 16 proxy.request(); 17 } 18 }