2018年08月29日
《Head First 设计模式》中对中介者模式的描述:
使用中介者模式(Mediator Pattern)来集中相关对象之间复杂的沟通和控制方式。
优点:将对象彼此解耦,增加复用性; 简化系统维护; 让对象间传递的消息变的简单且精简;
缺点:设计不当会让中介者本身变的过于复杂。
目录
下面以“男生女生联谊”作为例子,简单阐述中介者模式的使用;
1、思路
既然联谊,男生和女生之间必然存在着互动,这些互动是非常频繁且复杂的,所以在开始阶段往往需要一个第三方bo(媒婆)来加快联谊的进程;而这个媒婆就是应用了中介者模式;
2、测试代码
2.1 Person(抽象基类),
package designModel.tertiumQuidModel;
public abstract class Person {
private String name; //名字
private int condition; //匹配条件
private Mediator mediator; //中介者
public abstract void checkPerson(Person person); //抽象方法,供子类重写
public Person(String name, int condition, Mediator mediator) {
super();
this.name = name;
this.condition = condition;
this.mediator = mediator;
}
××× getter setter ×××
}
Man(实现子类)
public class Man extends Person {
public Man(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
// TODO Auto-generated constructor stub
}
@Override
public void checkPerson(Person person) {
// TODO Auto-generated method stub
this.getMediator().setMan(this);
this.getMediator().getPartner(person);
}
}
Woman(实现子类)
public class Woman extends Person{
public Woman(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
// TODO Auto-generated constructor stub
}
@Override
public void checkPerson(Person person) {
// TODO Auto-generated method stub
this.getMediator().setWoman(this);
this.getMediator().getPartner(person);
}
}
Mediator(媒婆)为中介者(作为成员属性)
package designModel.tertiumQuidModel;
public class Mediator {
private Man man;
private Woman woman;
××× getter setter ×××
public void getPartner(Person person){
if(person instanceof Man){
this.setMan((Man)person);
}else{
this.setWoman((Woman)person);
}
if(man.getCondition() == woman.getCondition()){
System.out.println(man.getName()+" and "+woman.getName()+" 联谊成功!!");
}else{
System.out.println(man.getName()+" and "+woman.getName()+" 牵手失败!!");
}
}
}
2.2 测试Demo
testDemo:
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mediator mediator = new Mediator();
Person man = new Man("C罗",27,mediator);
Person woman = new Woman("伊莲娜",25,mediator);
man.checkPerson(woman);
}
}
结果:
C罗 and 伊莲娜 牵手失败!!
花边:2010年初,C罗和伊莲娜在阿玛尼春夏季时装发布会上认识,C罗是阿玛尼男士内衣形象代言人,伊莲娜是女士内衣形象代言人,两人的爱情从这里开始。相恋五年后分手,如今两人都有了新的归宿,伊莲娜也有了自己的孩子!
3、解释
1) 中介者模式是行为模式之一,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2)这里就相当于两个具体的 Person 类,分别实现了抽象找对象方法,但是这里找对象可是通过中介介绍找的对象, 这个过程我们可以这样理解,因为抽象父类 Person 持有中介者 Mediator 类的引用, 所以我们这里的 getPartner 找对象方法,先是通过父类找到当前这个中介,然后注册相关会员信息,注册好后中介就会帮我们找对象了, 当我们调用找对象的方法,实际上是中介者帮我们找的对象;
3)中介者的出现减少了各个类之间的耦合,明确类之间的相互关系; 中介者模式将原来相互依存的多对多的类关系简化为中介者类与其他关联类一对多的关系, 当其中一个类修改时也不影响其他关联类。
4、参考
过多内容关注微信公众号:《十三的笔记本》