中介者模式

  中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

 

UML图:

  Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象,Mediator是抽象中介者,定义了同时对象到中介者对象的接口,Concretemediator是具体中介者对象,实现抽象类的方法,他需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发出命令。

代理示例如下:

1 //抽象同事类
2 public abstract class Colleague {
3     protected Mediator mediator;
4     
5     //构造方法,得到中介者对象
6     public Colleague(Mediator mediator){
7         this.mediator = mediator;
8     }
9 }

 

 1 //ConcreteColleague2同事类
 2 public class ConcreteColleague1 extends Colleague{
 3 
 4     public ConcreteColleague1(Mediator mediator) {
 5         super(mediator);
 6     }
 7     
 8     public void send(String message){
 9         //发送信息时通常是中介者发送出去的
10         mediator.send(message, this);
11     }
12     
13     public void inform(String message){
14         System.out.println("同事1得到信息:"+message);
15     }
16 
17 }

 

 

 1 //ConcreteColleague2同事类
 2 public class ConcreteColleague2 extends Colleague{
 3 
 4     public ConcreteColleague2(Mediator mediator) {
 5         super(mediator);
 6     }
 7     
 8     public void send(String message){
 9         //发送信息时通常是中介者发送出去的
10         mediator.send(message, this);
11     }
12     
13     public void inform(String message){
14         System.out.println("同事2得到信息:"+message);
15     }
16 
17 }

 

 

1 //Mediator类,抽象中介者类
2 public abstract class Mediator {
3     //定义一个抽象的发送消息的方法,得到同事对象和发送信息
4     public abstract void send(String message,Colleague colleague);
5 }

 

 

 1 //ConcreteMediator类,具体中介者类
 2 public class ConcreteMediator extends Mediator {
 3     private ConcreteColleague1 colleague1;
 4     private ConcreteColleague2 colleague2;
 5     
 6     public void setColleague1(ConcreteColleague1 colleague1) {
 7         this.colleague1 = colleague1;
 8     }
 9     public void setColleague2(ConcreteColleague2 colleague2) {
10         this.colleague2 = colleague2;
11     }
12 
13     //重写发送信息的方法,根据对象做出选择判断,通知对象
14     @Override
15     public void send(String message, Colleague colleague) {
16         if(colleague==colleague1){
17             colleague2.inform(message);//同事1要转告给同事2的消息
18         }else{
19             colleague1.inform(message);//同事2要回复同事1的消息
20         }
21     }
22 
23 }

客户端测试代码:

 1 //客户端
 2 public class TestClient {
 3     public static void main(String[] args) {
 4         ConcreteMediator m = new ConcreteMediator();
 5         
 6         //让两个具体同事类认识中介者对象
 7         ConcreteColleague1 c1 = new ConcreteColleague1(m);
 8         ConcreteColleague2 c2 = new ConcreteColleague2(m);
 9         
10         //让中介者认识各个具体同事类对象
11         m.setColleague1(c1);
12         m.setColleague2(c2);
13         
14         //具体同事类对象的发送信息都是通过中介者转发
15         c1.send("吃过饭了吗?");//同事1问同事2
16         c2.send("没有呢,你打算请客?");//同事2回答同事1
17     }
18 }

运行结果:

  同事2得到信息:吃过饭了吗?
  同事1得到信息:没有呢,你打算请客?

 

posted @ 2018-08-26 16:18  以前、以后  阅读(158)  评论(0编辑  收藏  举报