本文共 2943 字,大约阅读时间需要 9 分钟。
Mediator,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
(1)抽象中介者类
package designmode.mediator;public abstract class Mediator { //抽象,得到同事对象以及发送信息 public abstract void Send(String message,Colleague colleague);}
(2)抽象同事类
package designmode.mediator;public class Colleague { protected Mediator mediator; public Colleague(Mediator mediator){ this.mediator=mediator; }}
(3)具体中介者类
package designmode.mediator;public class ConcreteMediator extends Mediator{ private ConcreteColleague1 concreteColleague1; public ConcreteColleague2 concreteColleague2; public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) { this.concreteColleague1 = concreteColleague1; } public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) { this.concreteColleague2 = concreteColleague2; } //根据对象做出选择判断,通知对象 这里是重点 @Override public void Send(String message, Colleague colleague) { if(colleague==concreteColleague1){ concreteColleague2.Notify(message); }else{ concreteColleague1.Notify(message); } }}
(4)具体同事类
package designmode.mediator;public class ConcreteColleague1 extends Colleague{ public ConcreteColleague1(Mediator mediator){ super(mediator); } public void Send(String message){ mediator.Send(message,this); } public void Notify(String message){ System.out.println("同事1得信息:"+message); }}
package designmode.mediator;public class ConcreteColleague2 extends Colleague{ public ConcreteColleague2(Mediator mediator){ super(mediator); } public void Send(String message){ mediator.Send(message,this); } public void Notify(String message){ System.out.println("同事2得信息:"+message); }}
(5)客户端
package designmode.mediator;public class Client { public static void main(String[] args) { ConcreteMediator concreteMediator=new ConcreteMediator(); ConcreteColleague1 c1=new ConcreteColleague1(concreteMediator); ConcreteColleague2 c2=new ConcreteColleague2(concreteMediator); concreteMediator.setConcreteColleague1(c1); concreteMediator.setConcreteColleague2(c2); c1.Send("吃饭了没?"); c2.Send("没有呢,一起去?"); }}
测试结果
同事2得信息:吃饭了没?同事1得信息:没有呢,一起去?Process finished with exit code 0
中介者需要直到所有的具体同事类,责任太大
中介者模式很容易在系统中应用,也容易误用,当系统出现‘多对多’交互复杂的对象群时,不要急于使用,而是首先反思系统在系统上的设计是否合理。
优点
缺点
应用场合
一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。
以及向定制一个分布在多个类中的行为,但又不想生成太多子类的场合。
转载地址:http://zxfdi.baihongyu.com/