设计模式-中介者模式(Mediator Pattern)

设计模式-中介者模式(Mediator Pattern)



一、定义

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。

二、概念解释

可以想象有三个人A、B、C,三人之间互相交谈,A和B、C说话,B和A、C说话,C和A、B说话,相互紧密关联,如果再来一个D,那么A、B、C还得分别去和D产生联系,耦合性太强,如果我加一个中介者,所有的交谈都通过中介者进行传播,其他人只需要把想说的话告诉中介者,中介者去做传递,就大大降低了每个人之间的耦合关系

三、场景

网络游戏相比单机游戏有一个比较大的优势就是网络游戏中玩家之间可以通过聊天窗口进行交谈,这种社交功能会极大提高玩家的游戏积极性,毕竟单排上分注孤生,五黑开车才是快乐真谛,本例子就模拟三个人的聊天窗口,任意一个人说话其余人都可以看到,实现一个简单的中介者模式。

四、实现

1、类图

在这里插入图片描述

2、代码实现

首先定义一个抽象聊天中介类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值