设计模式之中介者模式

发布于:2024-05-03 ⋅ 阅读:(19) ⋅ 点赞:(0)

详细介绍

        中介者模式(Mediator Pattern)是一种行为设计模式,它通过定义一个中介类来封装多个对象之间的交互,使各对象不需要显示地相互引用,从而降低耦合度,提高系统的可维护性和灵活性。中介者模式将原本一对多的网状关系转变为一对多的关系,即每个对象只与中介者对象通信,而中介者负责将消息转发给正确的对象,从而实现对象之间的解耦。 

核心组件:

  • Mediator(中介者):定义一个接口,用于声明所有同事对象需要调用的中介方法。
  • ConcreteMediator(具体中介者):具体实现中介者接口,协调各个同事对象的交互,维持同事对象间的松耦合关系。
  • Colleague(同事):定义一个接口,声明同事对象所知道的中介者。每个同事只知道中介者而不知道其他同事的存在。
  • ConcreteColleague(具体同事):实现同事接口,实现自身业务逻辑,并通过中介者与其他同事通信。

使用场景

  1. 多个对象间存在复杂的相互依赖关系:当多个对象之间的直接交互复杂且难以管理时,可以使用中介者模式来简化对象间的通信。
  2. 需要降低对象间的耦合度:通过引入中介者,可以避免对象间的直接引用,从而降低系统的耦合度。
  3. 需要集中控制交互:当需要对一组对象的交互进行集中管理时,中介者模式可以提供一个中心控制点。

注意事项

  1. 中介者不应知道所有同事的详细信息:中介者应该只了解它需要协调的交互细节,而不必知道同事的具体实现。
  2. 避免过度集中:过度集中所有的交互到一个中介者可能会导致中介者本身变得过于复杂,考虑使用多个中介者来分解复杂性。
  3. 性能考量:中介者作为消息的中转站,频繁的调用可能会成为性能瓶颈,需注意优化。

优缺点

优点:

  • 降低耦合度:同事之间不直接通信,减少了相互依赖。
  • 简化对象间通信:通过中介者统一管理交互,简化了系统结构。
  • 易于维护和扩展:新增或修改同事类时,只需修改中介者即可,不影响其他同事。

缺点:

  • 中介者可能会变得复杂:随着系统复杂度增加,中介者可能需要处理越来越多的交互逻辑。
  • 不适用简单场景:对于简单的对象交互,引入中介者可能会造成不必要的复杂度。

Java代码示例

假设有一个聊天室系统,包含用户(User)和聊天室(ChatRoom)两种角色。

// 同事接口
interface Colleague {
    void receiveMessage(String message, Colleague sender);
    void sendMessage(String message);
}

// 具体同事:用户
class User implements Colleague {
    private String name;
    private ChatRoom chatRoom;

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

    @Override
    public void receiveMessage(String message, Colleague sender) {
        System.out.println(name + " received message from " + ((User)sender).getName() + ": " + message);
    }

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

    public String getName() {
        return name;
    }
}

// 中介者:聊天室
class ChatRoom implements Mediator {
    @Override
    public void sendMessage(Colleague sender, String message) {
        for (Colleague colleague : users) {
            if (!colleague.equals(sender)) {
                colleague.receiveMessage(message, sender);
            }
        }
    }

    private List<Colleague> users = new ArrayList<>();

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

// 使用示例
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();
        User john = new User("John", chatRoom);
        User jane = new User("Jane", chatRoom);
        
        chatRoom.addUser(john);
        chatRoom.addUser(jane);
        
        john.sendMessage("Hello, Jane!");
        jane.sendMessage("Hi, John! How are you?");
    }
}

使用过程中可能遇到的问题

  1. 中介者过于庞大:当中介者变得庞大和复杂时,可以考虑分解为多个小的中介者,或者引入更多的抽象层次。
  2. 过度集中控制:为了减少中介者负担,可以适当让一些简单的交互直接在同事间发生,仅将复杂的交互逻辑委托给中介者处理。

与其他模式的对比

  • 与观察者模式:两者都涉及对象间的通信,但观察者模式强调一对多的发布-订阅机制,而中介者模式更侧重于简化对象间的直接通信,控制复杂交互。
  • 与外观模式:外观模式为子系统提供一个统一的接口,隐藏子系统的复杂性;而中介者模式关注于协调一组对象之间的交互,降低它们之间的耦合度。
  • 与策略模式:策略模式关注于定义一系列算法,并在运行时选择其中一个算法执行。虽然两者都实现了行为的封装,但中介者模式更侧重于管理对象间的交互,而不是算法的替换。


网站公告

今日签到

点亮在社区的每一天
去签到