设计模式:中介者模式

        中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少多个对象和类之间的直接交互复杂性,通过引入一个中介机构(即中介者)来管理这些交互。中介者模式定义了一个中心组件,该组件负责协调各对象之间的通信,使得对象之间不必显式地相互引用,从而降低了系统的耦合性并提高了可维护性和灵活性。

概念核心

  • 中介者(Mediator):定义一个接口,用于同事对象之间的通信。中介者知道如何与各同事通信,如何将消息从一个同事转发给另一个同事。
  • 同事(Colleague):每一个同事都知道中介者,并且直接与其他同事通信时,都是通过中介者进行。每个同事都不直接与其它同事通信,而是通过中介者间接通信,使得对象之间的耦合度降低。

适用场景

  • 当一个系统中对象之间的交互复杂到难以理解,形成大量的相互关联时,可以使用中介者模式来整理这些交互。
  • 当你想在不修改类的情况下,改变对象之间的交互时,可以使用中介者模式来集中控制交互逻辑。
  • 在用户界面设计中,比如图形界面工具包,窗口、按钮、文本框等UI组件之间的交互可以通过中介者统一管理,简化组件之间的直接引用关系。
  • 在多层架构中,业务逻辑层或数据访问层的各个模块间可以通过中介者进行解耦。

优缺点

优点

  • 减少了对象之间的耦合,使得对象易于独立复用。
  • 将对象间的行为集中管理,便于修改和维护。
  • 支持动态地改变同事对象间的交互关系。

缺点

  • 中介者会成为系统的瓶颈,所有交互都集中于此,如果设计不当可能造成中介者过于复杂。
  • 如果同事对象间的交互很多,中介者的接口可能会非常庞大,难以管理。

实现要点

  • 定义一个抽象中介者类,声明一个接口用于同事对象之间的通信。
  • 实现具体中介者类,具体处理同事对象的交互逻辑。
  • 同事对象持有中介者的引用,但不知道其他同事的存在,只通过中介者进行通信。

        以下是一个使用Java实现的中介者模式示例。在这个例子中,我们将构建一个简单的聊天室模型,其中ChatRoom作为中介者,负责协调不同User(同事)之间的消息传递。

1. 创建中介者接口

        首先,定义一个中介者接口,描述中介者的基本功能,即如何传递信息。

public interface ChatRoom {
    void sendMessage(User user, String message);
}

2. 实现具体中介者 - 聊天室

        然后,创建一个具体的中介者类ChatRoomImpl,实现ChatRoom接口。这个类将负责接收来自用户的消息,并将其广播给所有其他用户。

import java.util.ArrayList;
import java.util.List;

public class ChatRoomImpl implements ChatRoom {
    private List<User> users = new ArrayList<>();

    public void addUser(User user) {
        users.add(user);
        user.setChatRoom(this);
    }

    @Override
    public void sendMessage(User user, String message) {
        for (User u : users) {
            if (u != user) {
                u.receiveMessage(user.getName() + ": " + message);
            }
        }
    }
}

3. 定义同事接口

        定义一个同事接口,表示能发送和接收消息的基本能力。

public interface User {
    void setChatRoom(ChatRoom chatRoom);
    String getName();
    void receiveMessage(String message);
}

4. 实现具体同事 - 用户

        创建用户类,实现User接口,每个用户都能发送消息并通过中介者接收消息。

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

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

    @Override
    public void setChatRoom(ChatRoom chatRoom) {
        this.chatRoom = chatRoom;
    }

    @Override
    public String getName() {
        return name;
    }

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

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

5. 客户端代码

        最后,客户端代码创建中介者和同事对象,并模拟用户间的交流。

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

        User alice = new UserImpl("Alice");
        User bob = new UserImpl("Bob");

        chatRoom.addUser(alice);
        chatRoom.addUser(bob);

        alice.sendMessage("Hi Bob, how are you?");
        bob.sendMessage("I'm good, thanks Alice! How about you?");
    }
}

        在这个示例中,ChatRoomImpl作为中介者管理着多个用户的通信,用户之间不直接相互通信,而是通过聊天室来传递消息,这减少了用户之间的耦合度,同时也方便在未来添加新的通信逻辑或者用户类型,提高了系统的灵活性和可维护性。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值