美文网首页
中介者模式

中介者模式

作者: 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