设计模式——中介者模式(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),并打印出接收到的消息。

相关推荐
Sitarrrr3 小时前
【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel
设计模式·c#·wpf
蓝天居士8 小时前
软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式
设计模式·系统架构·抽象工厂模式
cherry52308 小时前
【Java设计模式】第1章 课程导学
java·开发语言·设计模式
电子科技圈10 小时前
IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化
嵌入式硬件·设计模式·自动化·软件工程·软件构建·设计规范
自在如风。11 小时前
Java 设计模式:责任链模式详解
java·设计模式·责任链模式
马达加斯加D12 小时前
设计模式 --- 观察者模式
java·观察者模式·设计模式
钢板兽12 小时前
Java常见的23种设计模式
java·开发语言·设计模式
渊渟岳12 小时前
分享个人设计模式笔记文档:《掌握设计模式:23种经典模式实践、选择、价值与思想》
设计模式
01空间1 天前
设计模式简述(七)原型模式
设计模式
程序员JerrySUN1 天前
设计模式 Day 4:观察者模式(Observer Pattern)深度解析
javascript·观察者模式·设计模式