中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
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得到信息:没有呢,你打算请客?
不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练更加容易维护、容易扩展和复用,只有这样才可以真正得到提高
--《来自大话设计模式》