设计模式-中介者模式

中介者模式(Mediator Pattern)

中介者模式,又称为调解者模式或者调停者模式。它是用一个中介对象封装一系列的对象交互,使得各对象不需要显示的相互调用,降低耦合性,而且可以独立的改变这些对象之间的交互,属于行为型模式。

中介者模式的核心思想是通过中介者对象解耦系统各层次对象的直接耦合,各层次对象的对外依赖通信交由中介者对象进行转发。

微服务系统的注册中心的思想就很符合中介者思想。

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式通过提供一个中介类,将系统各层次对象之间的多对多关系变为一对多关系,中介者对象可以将复杂的网状结构变成以中介者为中心的星型结构,达到降低系统的复杂性,提高可扩展性的目的。

适用场景:

  • 系统中对象存在复杂的引用关系,产生的相互依赖关系 结构混乱且难以理解
  • 交互的公共行为,如果需要改变行为则可以增加新的中介者类。

角色

  • 抽象中介者(Mediator):定义统一的接口,用于各同事角色之间的通信
  • 具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体的同时对象发出指令,协调各同事之间的协作
  • 抽象同事类(Colleague):每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交由中介者进行转发协作
  • 具体同事类(ConcreteColleague):负责实现自发行为(SelfMethod),转发依赖方法交由中介者进行协调。

类图:
中介者模式.png

代码示例

简单模拟一下聊天室发送消息,ChatRoom作为中介者,User的不同对象为同事角色:

  • User类:
package com.caozz.demo2.mediator.chatroom;

public class User {
    private String name;
    private ChatRoom chatRoom;

    public User(String name, ChatRoom chatRoom) {
        this.name = name;
        this.chatRoom = chatRoom;
    }

    public String getName() {
        return name;
    }

    public void sendMessage(String msg){
        this.chatRoom.showMsg(this,msg);
    }
}

  • ChatRoom类:
package com.caozz.demo2.mediator.chatroom;

public class ChatRoom {

    public void showMsg(User user,String msg){
        System.out.println("[" + user.getName() + "] : " + msg);
    }
}
  • 测试:
package com.caozz.demo2.mediator.chatroom;

public class Test {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();

        User tom = new User("Tom",chatRoom);
        User jerry = new User("Jerry",chatRoom);

        tom.sendMessage("Hi! I am Tom.");
        jerry.sendMessage("Hello! My name is Jerry.");
    }
}

  • 测试结果:
[Tom] : Hi! I am Tom.
[Jerry] : Hello! My name is Jerry.
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

posted @ 2024-06-22 23:31  东方欲晓_莫道君行早  阅读(4)  评论(0编辑  收藏  举报