概念
说起中介者模式,就想起平时买房和租房的时候的中介,还有聊天室,中介者模式就和这些很像。我们靠一个中介者来处理类与类之间的交互关系。
角色
抽象中介者角色:定义了交互方式。
具体中介者角色:实现了交互方式。
抽象“对象类”:定义通用的操作。
具体“对象类”:实现抽象"对象"类。
上代码
就模拟一下聊天室聊天的代码,这里聊天室就是一个中介者类,因为大家都可以在里面讲话。这个例子比较简单,我就没有写抽象中介者类
具体中介者类
因为要处理对象间的关系,所以他必须持有各对象的引用。而我写的sayTox方法,其实可以统一成一个方法,但这样就需要添加if...else..判断了,所以这也暴露了中介者模式的缺点。
public class ChartRoom {
private UserA userA;
private UserB userB;
public void setUserA(UserA userA) {
this.userA = userA;
}
public void setUserB(UserB userB) {
this.userB = userB;
}
public void sayToB(String msg){
userB.getMsg(msg);
}
public void sayToA(String msg){
userA.getMsg(msg);
}
}
抽象 对象 类
拥有发送消息和接收消息的方法
public interface User {
/**
* 发送消息
*/
void say(ChartRoom chart);
/**
* 接收消息
*/
void getMsg(String msg);
}
具体 对象 类
public class UserA implements User{
@Override
public void say(ChartRoom chart) {
chart.sayToB("Hello I'm A");
}
@Override
public void getMsg(String msg) {
System.out.println("A got Msg:"+msg);
}
}
public class UserB implements User {
@Override
public void say(ChartRoom chart) {
chart.sayToA("hello I'm B");
}
@Override
public void getMsg(String msg) {
System.out.println("B got msg:"+msg);
}
}
模拟的客户端类
public class MediumClient {
public static void main(String[] args) {
System.out.println("初始化聊天室");
ChartRoom chartRoom = new ChartRoom();
UserA userA = new UserA();
UserB userB = new UserB();
chartRoom.setUserA(userA);
System.out.println("A 加入聊天室");
chartRoom.setUserB(userB);
System.out.println("B 加入聊天室");
userA.say(chartRoom);
userB.say(chartRoom);
}
}
The End
其实看了上面的代码,中介者模式的优缺点也表现的很明显了。这里再说一下,年底要考
优点:
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
缺点:
中介者会十分十分庞大,毕竟处理都是在中介者里面弄的。
所以什么时候使用呢,当然是当类与类的交互变的复杂的时候了,把他们从1对多转化成1对1,看着就瞬间清爽了。
好了,over。