一、什么是中介模式?
中介即Mediator,用中介对象来讲交互的几个对象进行封装,对象间不再直接进行通讯,而是通过中介间接沟通,降低了对象之间的耦合程度。当对象之间进行复杂的交互,对象之间的依赖混乱,这个时候就可以使用中介模式。
二、中介模式框图
使用中介模式的一个典型的场景是相亲。以前的相亲涉及到了男女两方及互相的父母,如果男方想向女方提出约会的请求,这个时候男方得先问下父母,然后告诉女方,女方要问过父母及自身的意见后再决定要不要和男方约会。女方想和男方约会也要遵循这样的一种模式。
这个模式其实问题很多,简单的一次约会请求就涉及到了各种对象,对象之间的关系太过复杂,这会在以后的使用中带来非常多的不便。
那么我们来应用下中介模式,中介在此案例中就是媒婆。应用了媒婆以后,如果男方想和女方约会,只需要告诉媒婆自己的诉求,然后媒婆会负责之后所有的事情。我们来看下应用中介模式的相亲类图:
三、中介模式的具体代码
3.1 Man类,男方相亲对象,内部含有中介Mediator的引用,在构造方法时要向中介“注册”自己
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class Man {
private Mediator mediator;
public Man(Mediator mediator){
this.mediator = mediator;
// 调用中介者的方法,将对象进行注册
mediator.registerMan(this);
}
/**
* 对女方发出约会请求
*/
public void tryDating(String message){
System.out.println("小姐姐!" + message);
System.out.println("************************************");
// 实际调用中介的方法向女方请求约会
mediator.askWomanForDating(message);
}
/**
* 思考女方的约会请求
*/
public boolean thinking(String message){
System.out.println("让我想一想...");
System.out.println("************************************");
if(message.length() > 10){
System.out.println("约约约!");
System.out.println("************************************");
return true;
} else {
System.out.println("丑拒!");
System.out.println("************************************");
return false;
}
}
}
3.2 ManParents类,男方父母
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class ManParents {
private Mediator mediator;
public ManParents(Mediator mediator){
this.mediator = mediator;
// 调用中介者的方法,将对象进行注册
mediator.registerManParents(this);
}
public boolean thinking(String message){
System.out.println("应不应该让我儿子和那个姑娘约会呢...");
System.out.println("************************************");
if(message.length() > 10){
System.out.println("姑娘眉清目秀,先见见吧!");
System.out.println("************************************");
return true;
} else {
System.out.println("丑拒!");
System.out.println("************************************");
return false;
}
}
}
3.3 Woman类,女方相亲对象
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class Woman {
private Mediator mediator;
public Woman(Mediator mediator){
this.mediator = mediator;
// 调用中介者的方法,将对象进行注册
mediator.registerWoman(this);
}
public void tryDating(String message){
System.out.println("欧巴!" + message);
// 实际调用中介的方法向女方请求约会
mediator.askManForDating(message);
}
public boolean thinking(String message){
System.out.println("让人家想一想嘛...");
System.out.println("************************************");
if(message.length() > 10){
System.out.println("他好帅啊!我也好想和他约会!");
System.out.println("************************************");
return true;
} else {
System.out.println("丑拒!");
System.out.println("************************************");
return false;
}
}
}
3.4 WomanParents类,女方父母
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class WomanParents {
private Mediator mediator;
public WomanParents(Mediator mediator){
this.mediator = mediator;
// 调用中介者的方法,将对象进行注册
mediator.registerWomanParents(this);
}
public boolean thinking(String message){
System.out.println("应不应该让我女儿和那个小子约会呢...");
System.out.println("************************************");
if(message.length() > 10){
System.out.println("小伙子很像韩国欧巴诶!先见见!");
System.out.println("************************************");
return true;
} else {
System.out.println("丑拒!");
System.out.println("************************************");
return false;
}
}
}
3.5 Mediator类,中介类,内部有男女方及其父母类的引用,负责男女两方的沟通
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class Mediator {
private Man man;
private ManParents manParents;
private Woman woman;
private WomanParents womanParents;
public void askWomanForDating(String message){
System.out.println("小伙子别猴急!我先问问女方和你父母");
System.out.println("************************************");
// 传递男方的约会请求给女方,媒人要看男方父母,女方父母和女方同不同意
manParents.thinking(message);
womanParents.thinking(message);
woman.thinking(message);
}
public void askManForDating(String message){
System.out.println("小姑娘矜持点!先让我问问男方和两方父母");
// 女方想与男方约会,要问下女方父母,男方父母,男方同不同意
womanParents.thinking(message);
manParents.thinking(message);
man.thinking(message);
}
/*
* 媒人注册客户,媒人的客户分别有男方及其父母,女方及其父母
* 媒人直接负责男女两方的沟通
* */
public void registerMan(Man man){
this.man = man;
}
public void registerManParents(ManParents manParents){
this.manParents = manParents;
}
public void registerWoman(Woman woman){
this.woman = woman;
}
public void registerWomanParents(WomanParents womanParents){
this.womanParents = womanParents;
}
}
3.6 BlindDate类, 相亲测试类
package designpatterns.mediator;
/**
* Created by Olive on 2017/12/12.
*/
public class BlindDate {
public static void main(String[] args){
Mediator mediator = new Mediator();
Man man = new Man(mediator);
ManParents manParents = new ManParents(mediator);
Woman woman = new Woman(mediator);
WomanParents womanParents = new WomanParents(mediator);
man.tryDating("我想和那个美腻的小姐姐约会~");
}
}
3.7 运行结果
小姐姐!我想和那个美腻的小姐姐约会~
************************************
小伙子别猴急!我先问问女方和你父母
************************************
应不应该让我儿子和那个姑娘约会呢...
************************************
姑娘眉清目秀,先见见吧!
************************************
应不应该让我女儿和那个小子约会呢...
************************************
小伙子很像韩国欧巴诶!先见见!
************************************
让人家想一想嘛...
************************************
他好帅啊!我也好想和他约会!
************************************
Process finished with exit code 0
3.8 结论
这是个看脸的世界XD