近日在研究设计模式,感觉代理模式是要重点掌握的,在这里记录一下。
什么是代理模式?比较官方的解释是:为其他对象设置一种代理以控制对实际对象的访问。
为了更好的理解代理模式,这里举个例子。在驻外现场,有一个项目经理、“二把手”和若干项目组成员,项目经理每天要安排项目组成员任务,主持晨会,写报告汇报工作进展。可是有几个月项目经理要回总部,这里就需要“二把手”来安排项目组成员任务,主持晨会,写报告汇报工作进展。而在这期间新来的同事只知“二把手”,而不识项目经理。
在上述例子中,“二把手”就是代理,新来的项目组成员只需要听吩咐做事,并不知道项目经理的存在。
该上图啦,代理模式如下图所示:
Subject类,定义了realSubject类和Proxy类的共用接口,这样就在任何使用realSubject的地方都可以使用Proxy。
realSubject类,定义Proxy所代表的真实实体。
Proxy类,保存一个引用使得代理可以访问实体,并提供一个和Subject的接口相同的接口,这样代理就可以用来代替实体。
代理模式Java代码实现如下:
1 package designPattern; 2 3 /** 4 * 代理模式 5 * @author yiRain 6 * 7 */ 8 public class ProxyTest { 9 public static void main(String[] args) { 10 Proxy erBaShou = new Proxy(); 11 erBaShou.assignTasks(); 12 erBaShou.handMeeting();erBaShou.report(); 13 } 14 15 } 16 17 //Subject抽象类,定义realSubject类和Proxy类的共用接口 18 abstract class Subject{ 19 public abstract void assignTasks();//安排工作任务 20 public abstract void handMeeting();//主持晨会 21 public abstract void report();//汇报工作 22 } 23 24 //RealSubject类,proxy代表的真实实体 25 //(项目经理) 26 class RealSubject extends Subject{ 27 @Override 28 public void assignTasks(){ 29 System.out.println("安排工作任务"); 30 } 31 32 @Override 33 public void handMeeting() { 34 System.out.println("主持晨会"); 35 36 } 37 38 @Override 39 public void report() { 40 System.out.println("汇报工作"); 41 42 }; 43 } 44 45 //Proxy类,保存一个引用使得代理可以访问实体, 46 //并提供一个和Subject的接口相同的接口,这样代理就可以用来代替实体 47 //(二把手) 48 class Proxy extends Subject{ 49 RealSubject realSubject = new RealSubject(); 50 51 @Override 52 public void assignTasks() { 53 realSubject.assignTasks(); 54 55 } 56 57 @Override 58 public void handMeeting() { 59 realSubject.handMeeting(); 60 61 } 62 63 @Override 64 public void report() { 65 realSubject.report(); 66 67 } 68 69 }