代理模式实现了职责分离,真实类可专注于具体业务,代理类用来提供访问控制等具体业务无关的功能。
下面以明星和经纪人的关系来理解一下代理模式。我们假设明星的主要工作是表演,代言,接受访问。在这些活动中,经纪人则需要为明星接受工作,安排档期,收钱等等。
代码上我以接受访问为例实现一下代理模式。
首先定义一个明星工作的接口。
1 public interface Subject { 2 //预约 3 boolean appointment(); 4 //讲话 5 void speech(); 6 }
接下来,经纪人实现Subject接口
1 public class Proxy implements Subject{ 2 private final Subject sub = new MrsF(); 3 4 @Override 5 public void speech() { 6 before(); 7 this.sub.speech(); 8 after(); 9 } 10 11 12 private void before(){ 13 System.out.println("说话之前喝口水"); 14 } 15 16 private void after(){ 17 System.out.println("说话之后赶紧溜"); 18 } 19 20 @Override 21 public boolean appointment() { 22 System.out.println("记者访问,接受吗?"); 23 return this.sub.appointment(); 24 } 25 }
明星完成具体工作。
1 public class MrsF implements Subject{ 2 3 @Override 4 public void speech() { 5 System.out.println("完全处理,已交律师捏造"); 6 } 7 8 @Override 9 public boolean appointment() { 10 return new Random().nextBoolean(); 11 } 12 13 }
访问
1 public static void main(String[] args) { 2 Proxy proxy = new Proxy(); 3 if (proxy.appointment()) { 4 System.out.println("接受了访问"); 5 proxy.speech(); 6 }else { 7 System.out.println("拒绝了访问"); 8 } 9 }
可以看到,外界去访问的时候不直接访问明星,而是通过其经纪人代为传话。
结果:
记者访问,接受吗?
接受了访问
说话之前喝口水
完全处理,已交律师捏造
说话之后赶紧溜
记者访问,接受吗?
拒绝了访问
可以看到,实现代理模式的关键是代理类与真实类的组合。由代理类实现对真实类的控制。这样就实现了对真实类的封装。