场景
买房租房找中介,男女相亲找中介。
用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其韧合松散,而且可以独立地改变它们之间的交互。
简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加人一个‘中介’对象,使得两头的对象分别和‘中介’,对象引用或者依赖。
意图
1、使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。
2、这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!
组成部分
1、抽象中介者角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2、具体中介者角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3、同事角色:每一个同事角色都知道对应的具体中介者角色.而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
应用场景
1、一组对象以定义良好但是复杂的方式进行通信,产生了混乱的依赖关系,也导致对象难以复用。
2、中介者模式很容易在系统中应用,也很容易在系统中误用。
3、当系统出现了‘多对多’交互复杂的对象群,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
应用实例
1.男女相亲约会:
1.明确,男人和女人如果约会,假设男方提出约会(女方提出过程类似).如果没有媒人,该过程如下:
a)男方如果想和女方约会,男方
b)首先请示自己的父母(^_^,假设是封建家庭哦…),
c)然后通知女方
d)女方需要请示女方父母.是否同意约会.
弊端:
需要男方交换的对象太多,
且关系复杂,
当随着男女之间的交往的复杂,
会涉及到更多复杂的交换,
双方父母的交换也很更复杂,
使得四个对象(男,女,男方家长,女方家长)关系复杂.
难以控制.
2.模式改进:
采取媒人做“中介者“模式,将变得简单:
其中无论那一个人有什么要求,请求,
只需要告诉“媒人“,
至于该请求需要告诉谁,
和谁交换,
只有媒人知道。
1. 男方类
public class Man {
private Matchmaker mat; // 媒人
public Man(Matchmaker mat) {
this.mat = mat;
mat.registeMan(this);//把自己在媒人那里注册(声明)
}
public static void main(String[] args) {
}
/** * 考虑是否同意 * * @return */
public boolean thinking(String says) {
System.out.println("男人考虑:我该不该同意呢???");
if (says.length() > 5) {
System.out.println("我同意了");
return true;
} else {
System.out.println("我不同意.");
return false;
}
}
/** * 提出约会 * 男人提出约会,只需要告诉媒人,由媒人负责跟其他人交互. * * @param says */
public void tryst(String says) {
System.out.println("男人提出约会请求,说:" + says);
mat.doManTryst(says);
}
}
2. 男方家长类
public class ManParent {
private Matchmaker mat; //媒人类
public ManParent(Matchmaker mat) {
this.mat = mat;
mat.registeManParent(this); //把自己在媒人那里注册(声明)
}
public static void main(String[] args) {
//ManParent manParent1 = new ManParent();
}
/** * 考虑是否同意 * * @return */
public boolean thinking(String says) {
System.out.println("男方父母考虑:我们做父母的该不该同意呢???");
if (says.length() > 5) {
System.out.println("我们做父母的同意了");
return true;
} else {
System.out.println("我们做父母的不同意.");
return false;
}
}
}
3.女方类
public class Woman {
private Matchmaker mat; // 媒人
public Woman(Matchmaker mat) {
this.mat = mat;
mat.registeWoman(this); //把自己在媒人那里注册(声明)
}
public static void main(String[] args) {
}
/** * 考虑是否同意 * * @return */
public boolean thinking(String says) {
System.out.println("女人考虑:我该不该同意呢???");
if (says.length() > 5) {
System.out.println("我同意了");
return true;
} else {
System.out.println("我不同意.");
return false;
}
}
/** * 提出约会 * 女人提出约会,只需要告诉媒人,由媒人负责跟其他人交互. * * @param says */
public void tryst(String says) {
System.out.println("女人提出约会请求,说:" + says);
mat.doWomanTryst(says);
}
}
4.女方家长类
public class WomanParent {
private Matchmaker mat; //媒人类
public WomanParent(Matchmaker mat) {
this.mat=mat;
mat.registerWomanParent(this); //把自己在媒人那里注册(声明)
}
public static void main(String[] args) {
//WomanParent womanParent1 = new WomanParent();
}
/** *考虑是否同意 * @return */
public boolean thinking(String says) {
System.out.println("女方父母考虑:我们做父母的该不该同意呢???");
if (says.length() > 5){
System.out.println("我们做父母的同意了");
return true;
}
else{
System.out.println("我们做父母的不同意.");
return false;
}
}
}
5.测试类
public class MatchmakerDemo {
public MatchmakerDemo() {
}
public static void main(String[] args) {
MatchmakerDemo matchmakerDemo1 = new MatchmakerDemo();
Matchmaker mat = new Matchmaker(); //媒人出现
Man man = new Man(mat);//男人,以媒人为建立构造参数
Woman woman=new Woman(mat);
ManParent manp=new ManParent(mat);
WomanParent womanp=new WomanParent(mat);
System.out.println("===========================");
man.tryst("我想和你约会,可以吗?");
System.out.println("===========================");
woman.tryst("想和你约会");
}
}
输出结果如下:
===========================
男人提出约会请求,说:我想和你约会,可以吗?
媒人开始处理约会问题开始
女人考虑:我该不该同意呢???
我同意了
男方父母考虑:我们做父母的该不该同意呢???
我们做父母的同意了
女方父母考虑:我们做父母的该不该同意呢???
我们做父母的同意了
媒人处理约会问题结束,根据同意的结果做其他处理
===========================
女人提出约会请求,说:想和你约会
媒人开始处理约会问题开始
男人考虑:我该不该同意呢???
我不同意.
男方父母考虑:我们做父母的该不该同意呢???
我们做父母的不同意.
女方父母考虑:我们做父母的该不该同意呢???
我们做父母的不同意.
媒人处理约会问题结束,根据同意的结果做其他处理