用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
可以想象有三个人A、B、C,三人之间互相交谈,A和B、C说话,B和A、C说话,C和A、B说话,相互紧密关联,如果再来一个D,那么A、B、C还得分别去和D产生联系,耦合性太强,如果我加一个中介者,所有的交谈都通过中介者进行传播,其他人只需要把想说的话告诉中介者,中介者去做传递,就大大降低了每个人之间的耦合关系
网络游戏相比单机游戏有一个比较大的优势就是网络游戏中玩家之间可以通过聊天窗口进行交谈,这种社交功能会极大提高玩家的游戏积极性,毕竟单排上分注孤生,五黑开车才是快乐真谛,本例子就模拟三个人的聊天窗口,任意一个人说话其余人都可以看到,实现一个简单的中介者模式。
首先定义一个抽象聊天中介类
public abstract class ChatMediator {
/**
* 聊天
* @param message 消息
* @param player 玩家
*/
public abstract void chat(String message, Player player);
}
定义一个具体的聊天窗口 需要定义所有的同事类以解耦交互行为
@Data
@EqualsAndHashCode(callSuper = false)
public class ChatWindow extends ChatMediator{
private ZhangSan zhangSan;
private LiSi liSi;
private WangWu wangWu;
@Override
public void chat(String message, Player player) {
// 谁发送消息 其余的人就接受消息
if (player == zhangSan) {
wangWu.getMessage(message);
liSi.getMessage(message);
}
if (player == liSi) {
zhangSan.getMessage(message);
wangWu.getMessage(message);
}
if (player == wangWu) {
zhangSan.getMessage(message);
liSi.getMessage(message);
}
}
}
抽象的同事类
public abstract class Player {
protected String name;
protected ChatMediator chatMediator;
public Player(String name, ChatMediator chatMediator) {
this.name = name;
this.chatMediator = chatMediator;
}
}
具体同事类 每个同事类都知道中介者,在与其他同事进行交互时,均通过中介者进行协作
public class ZhangSan extends Player{
public ZhangSan(String name, ChatMediator chatMediator) {
super(name, chatMediator);
}
public void chat(String message) {
chatMediator.chat(message, this);
}
public void getMessage(String message) {
System.out.println("zhangSan 获取到的消息是" + message);
}
}
public class LiSi extends Player{
public LiSi(String name, ChatMediator chatMediator) {
super(name, chatMediator);
}
public void chat(String message) {
chatMediator.chat(message, this);
}
public void getMessage(String message) {
System.out.println("Lisi 获取到的消息是" + message);
}
}
public class WangWu extends Player{
public WangWu(String name, ChatMediator chatMediator) {
super(name, chatMediator);
}
public void chat(String message) {
chatMediator.chat(message, this);
}
public void getMessage(String message) {
System.out.println("wangWu 获取到的消息是" + message);
}
}
任意一人发消息,其余人都可以获取到
@SpringBootTest
public class MediatorTest {
@Test
public void test() {
ChatWindow chatWindow = new ChatWindow();
ZhangSan zhangSan = new ZhangSan("张三", chatWindow);
LiSi liSi = new LiSi("李四", chatWindow);
WangWu wangWu = new WangWu("王五", chatWindow);
chatWindow.setZhangSan(zhangSan);
chatWindow.setLiSi(liSi);
chatWindow.setWangWu(wangWu);
zhangSan.chat("上线上线");
liSi.chat("我上单");
wangWu.chat("我打野");
}
}
优点:如前面所述,减少类间依赖,将一对多关系变为一对一,降低耦合
缺点:这个中介者会随着同事类之间交互方式的增加而不断膨胀,导致其逻辑就会越加复杂
代码地址: https://github.com/LuckyTeemo/design-pattern