设计模式——中介者模式(Mediator)

中介者模式(Mediator Pattern)是一种行为型设计模式,其主要作用是通过一个中介对象来封装一系列对象的交互,从而降低它们之间的耦合度,提高系统的可维护性和可扩展性。

中介者模式的主要特点

  • 封装交互:用一个中介对象来封装一系列对象的交互,这些对象不再直接相互引用,而是通过中介者进行交互。
  • 降低耦合:由于对象之间的交互被封装在中介者对象中,因此它们之间的耦合度降低,对象可以更加独立地变化和复用。
  • 集中控制:多个对象之间的交互被封装在中介者对象中集中管理,当交互行为发生变化时,只需要修改中介者对象即可,而不需要修改各个对象。
  • 一对多关联:通过引入中介者对象,将原本多个对象之间复杂的多对多关联关系转变为对象与中介者之间的一对多关联关系,简化了系统的结构。

中介者模式的角色

  • 中介者(Mediator):定义了一个接口,用于与各同事对象进行通信。
  • 同事对象(Colleague):实现了一个接口,该接口用于与中介者进行通信。同事对象之间不再直接相互引用,而是通过中介者进行交互。

中介者模式的优缺点

优点

  • 降低了对象之间的耦合度,使得对象更加独立,易于复用和维护。
  • 将对象间复杂的多对多关联关系转变为简单的一对多关联关系,提高了系统的灵活性和可扩展性。
  • 集中控制交互行为,使得修改和维护更加容易。

缺点

  • 当同事对象数量较多时,中介者对象可能会变得臃肿和复杂,难以维护。
  • 如果中介者对象出现故障,可能会导致整个系统崩溃。

适用场景

  • 当系统中对象之间存在复杂的引用关系,导致系统结构混乱且难以理解时。
  • 当需要创建一个运行于多个类之间的对象,但又不想生成新的子类时。
  • 当需要改变系统的交互方式,但又不希望修改现有的对象时。

示例

我们可以考虑一个简单的聊天室示例,其中用户(同事对象)通过聊天室(中介者)进行通信。以下是这个示例的Java代码:

java 复制代码
// 同事接口
interface Colleague {
    void sendMessage(String message);
    void receiveMessage(String message);
    void setMediator(Mediator mediator);
}

// 用户类,实现同事接口
class User implements Colleague {
    private Mediator mediator;
    private String name;

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

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(this, message);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " received: " + message);
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}

// 中介者接口
interface Mediator {
    void register(Colleague colleague);
    void sendMessage(Colleague sender, String message);
}

// 聊天室类,实现中介者接口
class ChatRoom implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        colleagues.add(colleague);
        colleague.setMediator(this);
    }

    @Override
    public void sendMessage(Colleague sender, String message) {
        for (Colleague colleague : colleagues) {
            if (!colleague.equals(sender)) {
                colleague.receiveMessage(sender.name + ": " + message);
            }
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();

        User user1 = new User("Alice");
        User user2 = new User("Bob");

        chatRoom.register(user1);
        chatRoom.register(user2);

        user1.sendMessage("Hello, Bob! How are you?");
    }
}

在这个示例中,我们定义了一个Colleague接口,它包含了发送和接收消息的方法以及设置中介者的方法。User类实现了这个接口,并包含了用户的名字。Mediator接口定义了注册同事和发送消息的方法。ChatRoom类实现了这个接口,并管理了一个同事对象的列表。在ChatRoomsendMessage方法中,它遍历了所有的同事对象,并将消息发送给除了发送者之外的所有其他同事。

Client类中,我们创建了一个ChatRoom对象和两个User对象,并将它们注册到聊天室中。然后,我们让Alice向Bob发送一条消息。当这条消息被发送时,聊天室会将它转发给所有其他的用户(在这个例子中只有Bob),并打印出接收到的消息。

相关推荐
信徒_1 小时前
常用设计模式
java·单例模式·设计模式
lxyzcm19 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千19 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)19 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲21 小时前
设计模式——桥接模式
设计模式·桥接模式
捕鲸叉1 天前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
小小小妮子~1 天前
框架专题:设计模式
设计模式·框架
先睡1 天前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Damon_X1 天前
桥接模式(Bridge Pattern)
设计模式·桥接模式
越甲八千2 天前
重温设计模式--享元模式
设计模式·享元模式