中介者模式
用一个中介对象来封装一系列对象的交互。中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
涉及到的角色描述
– Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口。
– ConcreteMediator:具体中介者角色,它从具体的同事对象接收消息,向具体同事发出命令。
– Colleague:抽象同事角色,定义了中介者对象接口,它只知道中介者而不知道其他同事对象。
– ConcreteColleague:具体同事角色,每个具体同事类都知道自己在小范围内的行为,而不知道它在大范围内的目的。
优点
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
缺点
中介者会庞大,变得复杂难以维护。
使用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
具体代码实现
先定义抽象中介Mediator
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description: 中介者接口
* @Date: created in 2018/8/28
* @Modified By:
*/
public interface UniteNations {
void declare(String message,Country country);
}
抽象同事类Colleague
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description: 抽象国家类持有一个中介者对象
* @Date: created in 2018/8/28
* @Modified By:
*/
public abstract class Country {
UniteNations uniteNations;
Country(UniteNations uniteNations){
this.uniteNations = uniteNations;
}
}
具体同事1ConcreteColleague1
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/28
* @Modified By:
*/
public class USA extends Country {
USA(UniteNations uniteNations) {
super(uniteNations);
}
public void declare(String message){
uniteNations.declare(message,this);
}
public void getMessage(String message){
System.out.println("美国获得对方消息:"+message);
}
}
具体同事1ConcreteColleague2
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/28
* @Modified By:
*/
public class Iraq extends Country {
Iraq(UniteNations uniteNations) {
super(uniteNations);
}
public void declare(String message){
uniteNations.declare(message,this);
}
public void getMessage(String message){
System.out.println("伊拉克获得对方消息:"+message);
}
}
具体中介者
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description: 具体中介者
* @Date: created in 2018/8/28
* @Modified By:
*/
public class UniteNationsSecurity implements UniteNations {
private USA usa;
private Iraq iraq;
public void setUSA(USA usa){
this.usa=usa;
}
public void setIraq(Iraq iraq){
this.iraq=iraq;
}
@Override
public void declare(String message, Country country) {
if(country==usa){
iraq.getMessage(message);
}else if(country==iraq){
usa.getMessage(message);
}
}
}
客户端
package com.chenpt.designModel.mediatorModel;
/**
* @Author: chen
* @Description:
* @Date: created in 2018/8/28
* @Modified By:
*/
public class MainTest {
public static void main(String[] as){
UniteNationsSecurity security = new UniteNationsSecurity();
USA usa = new USA(security);
Iraq iraq = new Iraq(security);
security.setUSA(usa);
security.setIraq(iraq);
usa.declare("不准研制核武器,否则发动战争");
iraq.declare("我们没有核武器,也不怕侵略");
}
}
//执行结果
伊拉克获得对方消息:不准研制核武器,否则发动战争
美国获得对方消息:我们没有核武器,也不怕侵略