本文共 2451 字,大约阅读时间需要 8 分钟。
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互 。中介者使个对象不需要显示的互相引用,使其耦合松散,而且可以独立的改变他们之间的交互。
1、抽象中介者
public abstract class Mediator { public abstract void send(String message,Colleague colleague);}
2、抽象同事类
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; }}
3、具体同事类
public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(Mediator mediator) { super(mediator); } public void send(String message){ mediator.send(message,this); } public void notifyMessage(String message){ System.out.println("同事A收到信息:"+message); }}public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(Mediator mediator) { super(mediator); } public void send(String message){ mediator.send(message,this); } public void notifyMessage(String message){ System.out.println("同事B收到的信息:"+message); }}
4、具体中介者
public class ConcreteMediator extends Mediator { private ConcreteColleagueA concreteColleagueA; private ConcreteColleagueB concreteColleagueB; @Override public void send(String message, Colleague colleague) { if(colleague == concreteColleagueA){ concreteColleagueB.notifyMessage(message); }else { concreteColleagueA.notifyMessage(message); } } public ConcreteColleagueA getConcreteColleagueA() { return concreteColleagueA; } public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) { this.concreteColleagueA = concreteColleagueA; } public ConcreteColleagueB getConcreteColleagueB() { return concreteColleagueB; } public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) { this.concreteColleagueB = concreteColleagueB; }}
5、测试类
public class Test { public static void main(String[] args) { ConcreteMediator concreteMediator = new ConcreteMediator(); ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(concreteMediator); ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB(concreteMediator); concreteMediator.setConcreteColleagueA(concreteColleagueA); concreteMediator.setConcreteColleagueB(concreteColleagueB); concreteColleagueA.send("吃饭了吗?"); concreteColleagueB.send("没有呢,你要请客吗?"); }}输出:同事B收到的信息:吃饭了吗?同事A收到信息:没有呢,你要请客吗?
注:参考文献《大话设计模式》程杰著。