[一天一个设计模式]-[中介者模式]

中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

与代理模式的区别,代理模式主要是代理某一类对象,中介模式是中介了一组对象,代理模式主要是控制真实对象的访问,中介模式主要是将调用者和被调用者解耦

中介者模式包含以下主要角色。

  1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

举个栗子,qq群聊,qq就相当于中介者,群成员就是同事类


interface QqMediator{
    void register(User user);
    void showMessage(User user,String msg);
}

class QqMediatorImpl implements QqMediator{
    
    List<User> users = new ArrayList<>();
    
    @Override
    public void register(User user){
        users.add(user);
        user.setMediator(this);
    }
    
    @Override
    public void showMessage(User user,String msg){
        sout(user.getName()+":"+msg);
    }
}

interface User{
    
    String getName();
    void setMediator(QqMediator mediator);
    void send(String msg);
}

class UserA implements User{
    String name="A";
    QqMediator mediator;
    
    @Override
    public String getName(){
        return this.name;
    }
    
    @Override
    public void setMediator(QqMediator mediator){
        this.mediator = mediator;
    }
    
    @Override
    public void send(String msg){
        mediator.showMessage(this,msg);
    }
}

class UserB implements User{
    String name="B";
    QqMediator mediator;
    
    @Override
    public String getName(){
        return this.name;
    }
    
    @Override
    public void setMediator(QqMediator mediator){
        this.mediator = mediator;
    }
    
    @Override
    public void send(String msg){
        mediator.showMessage(this,msg);
    }
}


main(){
    QqMediator mediator=new QqMediatorImpl();
    User a = new UserA();
    User b = new UserB();
    
    mediator.register(a);
    mediator.register(b);
    
    a.send("I'm A");
    
    b.send("I'm B");
    
    
}
原文地址:https://www.cnblogs.com/A-yes/p/12026930.html