代理模式

代理模式实现了职责分离,真实类可专注于具体业务,代理类用来提供访问控制等具体业务无关的功能。

下面以明星和经纪人的关系来理解一下代理模式。我们假设明星的主要工作是表演,代言,接受访问。在这些活动中,经纪人则需要为明星接受工作,安排档期,收钱等等。

代码上我以接受访问为例实现一下代理模式。

首先定义一个明星工作的接口。

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     }

可以看到,外界去访问的时候不直接访问明星,而是通过其经纪人代为传话。

结果:

记者访问,接受吗?
接受了访问
说话之前喝口水
完全处理,已交律师捏造
说话之后赶紧溜
记者访问,接受吗?
拒绝了访问

可以看到,实现代理模式的关键是代理类与真实类的组合。由代理类实现对真实类的控制。这样就实现了对真实类的封装。

posted on 2018-07-10 11:09  xushy  阅读(148)  评论(0编辑  收藏  举报

导航