简单梳理中介者模式
中介者模式的实现
现实生活中,经常会见到对话双方靠中介来传递消息的场景。
比如在当前的国际形势下,不同国家之间对话,就可以通过联合国安理会来对话。
我们来看下这种使用中间人对话的场景如何用设计模式来实现。
国家基类
//国家
public abstract class Country {
protected UnitedNations unitedNations;
public Country(UnitedNations unitedNations) {
this.unitedNations = unitedNations;
}
}
联合国基类
//联合国机构
public abstract class UnitedNations {
public abstract void Declare(String message, Country country);
}
实现两个具体的国家类,当然,继承自国家基类
public class USA extends Country{
public USA(UnitedNations unitedNations) {
super(unitedNations);
}
public void Declare(String message){
unitedNations.Declare(message,this);
}
public void GetMessage(String message){
System.out.println("美方获得对方的消息:"+message);
}
}
public class Iraq extends Country{
public Iraq(UnitedNations unitedNations) {
super(unitedNations);
}
public void Declare(String message){
unitedNations.Declare(message,this);
}
public void GetMessage(String message){
System.out.println("伊方获得对方的消息:"+message);
}
}
实现一个传话的中介类,比如联合国安理会,来实现两个国家的对话传递,当然继承自联合国基类
public class UnitedNationsSecurityCouncil extends UnitedNations{
private USA usa;
private Iraq iraq;
public USA getUsa() {
return usa;
}
public void setUsa(USA usa) {
this.usa = usa;
}
public Iraq getIraq() {
return iraq;
}
public void setIraq(Iraq iraq) {
this.iraq = iraq;
}
@Override
public void Declare(String message, Country country) {
if(country == usa){
iraq.GetMessage(message);
}else{
usa.GetMessage(message);
}
}
}
这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。
定义业务方法
看在具体业务逻辑中如何使用
public class MediatorTest {
public static void main(String[] args) {
//中介者模式
func1();
}
public static void func1(){
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA usa = new USA(UNSC);
Iraq iraq = new Iraq(UNSC);
UNSC.setUsa(usa);
UNSC.setIraq(iraq);
usa.Declare("不准瞎搞");
iraq.Declare("我们没有瞎搞");
}
}
执行结果
伊方获得对方的消息:不准瞎搞
美方获得对方的消息:我们没有瞎搞
结果分析
中介者模式,用一个中介对象,来封装一系列的对象交互。
中介者使得各对象不需要显示的引用,从而降低耦合度,而且可以独立的改变他们的交互。
中介者模式很容易在系统中使用,但是需要注意,中介者模式也很容易在系统中误用,
当出现多对多等复杂的场景时,不要着急使用中介者模式,而是考虑设计是否合理。
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com