美文网首页
中介者模式

中介者模式

作者: nieniemin | 来源:发表于2020-06-22 22:41 被阅读0次

什么是中介者模式

用一个中介对象对封装一系列的对象交互,终结者使各个对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

模式角色

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

UML类图

中介者模式

代码实现

一般存在网状结构的场景,都可以使用中介者来优化。像学习群组的互相通知,各个国家通过联合国这个中介,来协商达成意见等。消息的发送是由中介者去统一管理。

public abstract class Colleague {

    // 中介者
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void  send();

    public abstract void receive();
}
public abstract class Mediator {

    // 注册同事
    public abstract void register(Colleague colleague);
  // 通知同事
    public abstract void relay(Colleague colleague);
}
public class ConcreteMediator extends Mediator {
    //定义一个 List 来管理同事对象
    private List<Colleague> list;

    public ConcreteMediator() {
        list = new ArrayList<>();
    }

    // 注册同事
    @Override
    public void register(Colleague colleague) {
        if (!list.contains(colleague)) {
            colleague.setMediator(this);
            list.add(colleague);
        }
    }

    // 通知同事
    @Override
    public void relay(Colleague colleague) {
        // 转发给其他同事
        list.forEach(x -> {
            if (!x.equals(colleague)) {
                x.receive();
            }
        });
    }
}
public class ConcreteColleague1 extends Colleague {

    @Override
    public void send() {
        System.out.println("colleague1 发送消息");
        //请中介者转发
        this.mediator.relay(this);
    }

    @Override
    public void receive() {
        System.out.println("colleague1 接收消息");
    }
}

public class ConcreteColleague2 extends Colleague {

    @Override
    public void send() {
        System.out.println("colleague2 发送消息");
        //请中介者转发
        this.mediator.relay(this);
    }

    @Override
    public void receive() {
        System.out.println("colleague2 接收消息");
    }
}
public class Client {
    public static void main(String[] args) {
        //构建中介者
        Mediator mediator = new ConcreteMediator();

        //构建具体的同事类
        Colleague colleague1 = new ConcreteColleague1();
        Colleague colleague2 = new ConcreteColleague2();

        //注册同事
        mediator.register(colleague1);
        mediator.register(colleague2);

        //发送消息
        colleague1.send();
        colleague2.send();
    }

}
colleague1 发送消息
colleague2 接收消息
colleague2 发送消息
colleague1 接收消息

优点

  • 降低了对象之间的耦合性,使得对象易于独立地被复用。
  • 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
    缺点
    当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
    中介者模式完整代码

相关文章

网友评论

      本文标题:中介者模式

      本文链接:https://www.haomeiwen.com/subject/seeoxktx.html