二十一、行为型(中介者模式)

中介者模式(Mediator Pattern)

概念
中介者模式是一种行为型设计模式,通过引入一个中介者对象,来减少多个对象之间的直接交互。中介者将对象之间的交互封装在一个统一的接口中,从而降低对象之间的耦合度,增强系统的可维护性和可扩展性。


应用场景

  1. 复杂的对象交互:当系统中存在多个对象并且它们之间有复杂的相互交互时,中介者模式可以帮助简化对象之间的通信。

  2. 解耦对象:当需要减少对象之间的耦合,避免直接引用时,中介者模式提供了一种良好的解耦方案。

  3. 系统扩展:当需要对系统进行扩展时,添加新的对象或功能可以通过中介者进行,而无需修改其他对象的代码。

  4. 聊天系统:在一个聊天应用中,用户通过一个中介者(如聊天服务器)进行消息的发送和接收,从而避免了用户之间的直接交互。


注意点

  1. 中介者复杂性:如果中介者承担了过多的责任,可能导致中介者本身变得复杂,从而影响系统的可维护性。

  2. 性能问题:中介者可能会引入额外的性能开销,尤其是在处理大量消息时,需要合理设计中介者的实现。

  3. 中介者的角色:中介者模式适用于对象之间存在复杂交互的情况,而在简单交互的场景中,使用中介者可能显得多余。


核心要素

  1. Mediator(中介者接口):定义与各个同事对象的交互接口。

  2. ConcreteMediator(具体中介者):实现中介者接口,协调同事对象之间的交互。

  3. Colleague(同事接口):定义同事对象的接口,通过中介者进行交互。

  4. ConcreteColleague(具体同事):实现同事接口,具体的同事对象,使用中介者与其他同事进行交互。


Java代码完整示例

示例:简单的中介者模式实现

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

// 具体中介者
class ConcreteMediator implements Mediator {
    
    
    private List<Colleague> colleagues = new ArrayList<>();

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

    @Override
    public void send(String message, Colleague sender) {
    
    
        for (Colleague colleague : colleagues) {
    
    
            // 不发送给发送者
            if (colleague != sender) {
    
    
                colleague.receive(message);
            }
        }
    }
}

// 同事接口
abstract class Colleague {
    
    
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
    
    
        this.mediator = mediator;
    }

    public abstract void receive(String message);
}

// 具体同事A
class ConcreteColleagueA extends Colleague {
    
    
    public ConcreteColleagueA(Mediator mediator) {
    
    
        super(mediator);
    }

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

    public void send(String message) {
    
    
        System.out.println("ConcreteColleagueA sending: " + message);
        mediator.send(message, this);
    }
}

// 具体同事B
class ConcreteColleagueB extends Colleague {
    
    
    public ConcreteColleagueB(Mediator mediator) {
    
    
        super(mediator);
    }

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

    public void send(String message) {
    
    
        System.out.println("ConcreteColleagueB sending: " + message);
        mediator.send(message, this);
    }
}

// 客户端代码
public class MediatorPatternDemo {
    
    
    public static void main(String[] args) {
    
    
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

        mediator.register(colleagueA);
        mediator.register(colleagueB);

        colleagueA.send("Hello, B!");
        colleagueB.send("Hi, A!");
    }
}

输出结果

ConcreteColleagueA sending: Hello, B!
ConcreteColleagueB received: Hello, B!
ConcreteColleagueB sending: Hi, A!
ConcreteColleagueA received: Hi, A!

各种变形用法完整示例

  1. 多个同事类型的交互

    通过扩展同事对象的类型,允许更多的对象参与到中介者的交互中。

    代码示例:多个同事类型

    // 具体同事C
    class ConcreteColleagueC extends Colleague {
          
          
        public ConcreteColleagueC(Mediator mediator) {
          
          
            super(mediator);
        }
    
        @Override
        public void receive(String message) {
          
          
            System.out.println("ConcreteColleagueC received: " + message);
        }
    
        public void send(String message) {
          
          
            System.out.println("ConcreteColleagueC sending: " + message);
            mediator.send(message, this);
        }
    }
    
    public class MultiColleagueDemo {
          
          
        public static void main(String[] args) {
          
          
            ConcreteMediator mediator = new ConcreteMediator();
    
            ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
            ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
            ConcreteColleagueC colleagueC = new ConcreteColleagueC(mediator);
    
            mediator.register(colleagueA);
            mediator.register(colleagueB);
            mediator.register(colleagueC);
    
            colleagueA.send("Hello, B and C!");
            colleagueC.send("Hi, A and B!");
        }
    }
    
  2. 中介者与同事的复杂交互

    中介者可以实现更复杂的业务逻辑,如对消息进行过滤或修改。

    代码示例:复杂交互

    class EnhancedMediator implements Mediator {
          
          
        private List<Colleague> colleagues = new ArrayList<>();
    
        @Override
        public void register(Colleague colleague) {
          
          
            colleagues.add(colleague);
        }
    
        @Override
        public void send(String message, Colleague sender) {
          
          
            // 简单的消息过滤
            if (!message.contains("spam")) {
          
          
                for (Colleague colleague : colleagues) {
          
          
                    if (colleague != sender) {
          
          
                        colleague.receive(message);
                    }
                }
            } else {
          
          
                System.out.println("Message blocked: " + message);
            }
        }
    }
    
    public class EnhancedMediatorDemo {
          
          
        public static void main(String[] args) {
          
          
            EnhancedMediator mediator = new EnhancedMediator();
    
            ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
            ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
    
            mediator.register(colleagueA);
            mediator.register(colleagueB);
    
            colleagueA.send("Hello, B!");
            colleagueB.send("spam message"); // 这条消息将被阻止
        }
    }
    
  3. 中介者的状态管理

    中介者可以维护状态信息,协调同事对象的状态。

    代码示例:状态管理

    class StateMediator implements Mediator {
          
          
        private List<Colleague> colleagues = new ArrayList<>();
        private String state;
    
        @Override
        public void register(Colleague colleague) {
          
          
            colleagues.add(colleague);
        }
    
        public void setState(String state) {
          
          
            this.state = state;
            notifyColleagues();
        }
    
        private void notifyColleagues() {
          
          
            for (Colleague colleague : colleagues) {
          
          
                colleague.receive("State updated to: " + state);
            }
        }
    
        @Override
        public void send(String message, Colleague sender) {
          
          
            // 这里可以实现其他交互逻辑
        }
    }
    
    public class StateMediatorDemo {
          
          
        public static void main(String[] args) {
          
          
            StateMediator mediator = new StateMediator();
    
            ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
            ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
    
            mediator.register(colleagueA);
            mediator.register(colleagueB);
    
            mediator.setState("Active");
        }
    }
    

通过这些示例,中介者模式的灵活性和应用场景得以体现,可以根据具体需求实现多种变形用法。

猜你喜欢

转载自blog.csdn.net/xiaoqi270620903/article/details/143307061