中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Mediator Pattern
Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.
中介者模式的结构中包括四种角色
- 中介者(Mediator):中介者是一个接口,该接口定义了用于同事(Colleague)对象之间进行通信的方法。
- 具体中介者(ConcreteMediator):具体中介者是实现中介者接口的类。具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。
- 同事(Colleague):一个接口,规定了具体同事需要实现的方法。
- 具体同事(ConcreteColleague):实现同事接口的类。具体同事需要包含具体中介者的引用,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者即可。
中介者模式的类图
中介者模式的优点
- 可以避免许多的对象为了之间的通信而相互显示的引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象。
- 可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。
- 具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。
- 具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中的同事是如何交互的。
- 当一些对象相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象相互通信。
注:由于中介者集中了同事之间是如何交互的细节,可能使具体中介者变得非常复杂,增加了维护的难度。
适合中介者模式使用的情景
- 许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护。
- 一个对象引用其他很多对象,导致难以复用该对象。
中介者模式应用实例
古代相互交战的A,B,C三方想通过一个中介者调停之间的战火。A方委托调停者 传达的信息是:"要求B方归还曾抢夺的100斤土豆,要求C方归还曾抢夺的20头牛";B方委托调停者传达的信息是:"要求A方归还曾抢夺的10只公鸡,要求C方 归还曾抢夺的15匹马";C方委托调停者传达的信息是:要求A方归还曾抢夺的300斤小麦,要求B方归还曾抢夺的50头驴;
1.同事(Colleague)
本问题中,同事接口是Colleague,定义了具体同事,即交战各方需要实现的方法。Colleague接口的代码实现如下:
/*
* 同事接口,定义了具体同事,即交战各方需要实现的方法
*/
public interface Colleague
{
public void giveMess(String[] mess);
public void receiverMess(String mess);
public void setName(String name);
public String getName();
}
2.中介者(Mediator)
/*
* 中介者接口
*/
public interface Mediator {
public void deliverMess(Colleague collague,String[] mess);
}
3.具体中介者
//具体中介者
public class ConcreteMediator implements Mediator{
CollagueA colleagueA;
CollagueB colleagueB;
CollagueC colleagueC;
public void registerColleagueA(CollagueA colleagueA)
{
this.colleagueA = colleagueA;
}
public void registerColleagueB(CollagueB colleagueB)
{
this.colleagueB = colleagueB;
}
public void registerColleagueC(CollagueC colleagueC)
{
this.colleagueC = colleagueC;
}
public void deliverMess(Colleague colleague,String[] mess)
{
if(colleague == colleagueA)
{
if(mess.length >= 2)
{
colleagueB.receiverMess(colleague.getName()+mess[0]);
colleagueC.receiverMess(colleague.getName()+mess[1]);
}
}
if(colleague == colleagueB)
{
if(mess.length >= 2)
{
colleagueA.receiverMess(colleague.getName()+mess[0]);
colleagueC.receiverMess(colleague.getName()+mess[1]);
}
}
if(colleague == colleagueC)
{
if(mess.length >= 2)
{
colleagueA.receiverMess(colleague.getName()+mess[0]);
colleagueB.receiverMess(colleague.getName()+mess[1]);
}
}
}
}
4.具体同事
ColleagueA.java
/*
* 具体同事
*/
public class CollagueA implements Colleague {
ConcreteMediator mediator;
String name;
CollagueA(ConcreteMediator mediator)
{
this.mediator = mediator;
mediator.registerColleagueA(this);
}
@Override
public void giveMess(String[] mess) {
mediator.deliverMess(this,mess);
}
@Override
public void receiverMess(String mess) {
System.out.println(name+"收到的消息是:");
System.out.println(mess);
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
ColleagueB.java
/*
* 具体同事
*/
public class CollagueB implements Colleague{
ConcreteMediator mediator;
String name;
CollagueB(ConcreteMediator mediator)
{
this.mediator = mediator;
mediator.registerColleagueB(this);
}
public void receiverMess(String mess) {
System.out.println(name+"收到的信息是:");
System.out.println(mess);
}
@Override
public void giveMess(String[] mess) {
mediator.deliverMess(this, mess);
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
ColleagueC.java
/*
* 具体同事
*/
public class CollagueC implements Colleague{
ConcreteMediator mediator;
String name;
public CollagueC(ConcreteMediator mediator)
{
this.mediator = mediator;
mediator.registerColleagueC(this);
}
@Override
public void receiverMess(String mess) {
System.out.println(name+"收到的消息是:");
System.out.println(mess);
}
@Override
public void giveMess(String[] mess) {
mediator.deliverMess(this, mess);
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
5.模式的使用
public class Application {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
CollagueA collagueA = new CollagueA(mediator);
CollagueB collagueB = new CollagueB(mediator);
CollagueC collagueC = new CollagueC(mediator);
collagueA.setName("中国");
collagueB.setName("美国");
collagueC.setName("日本");
String[] messA = {"要求归还曾抢夺的100斤土豆","要求归还曾抢夺的20头牛"};
collagueA.giveMess(messA);
String[] messB = {"要求归还曾抢夺的10只公鸡","要求归还曾抢夺的15匹马"};
collagueB.giveMess(messB);
String[] messC = {"要求归还曾抢夺的300斤小麦","要求归还曾抢夺的50头驴"};
collagueC.giveMess(messC);
}
}
6.运行结果
美国收到的信息是:
中国要求归还曾抢夺的100斤土豆
日本收到的消息是:
中国要求归还曾抢夺的20头牛
中国收到的消息是:
美国要求归还曾抢夺的10只公鸡
日本收到的消息是:
美国要求归还曾抢夺的15匹马
中国收到的消息是:
日本要求归还曾抢夺的300斤小麦
美国收到的信息是:
日本要求归还曾抢夺的50头驴
转载于:https://blog.51cto.com/chenyi2013/1189880