zoukankan      html  css  js  c++  java
  • Java设计模式系列之中介者模式

    中介者模式(Mediator)的定义

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

    中介者模式(Mediator)的适用性

    1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。

    2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

    3.想定制一个分布在多个类中的行为,但又不想生成太多的子类。

    中介者模式(Mediator)的参与者

    1.Mediator

    中介者定义一个接口用于与各同事(Colleague)对象通信。

    2.ConcreteMediator

    具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。

    3.Colleague:

    抽象同事类。

    4.Colleagueclass

    具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者

    中介者模式的UML类图

                    

    具体代码实现:

    第一步:定义Mediator

    //定义抽象Mediator,可以与同时们进行联络
     public abstract class Mediator {
         public abstract void contact(String content,Colleague coll);
     }

     第二步:定义抽象Colleague

    public class Colleague {
        protected String name;
        protected Mediator mediator;
    
        public Colleague(String name, Mediator mediator) {
            this.name = name;
            this.mediator = mediator;
        }
    }

     第三步:定义具体Colleagueclass

    public class ColleagueA extends Colleague {
    
        // 具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了
        public ColleagueA(String name, Mediator mediator) {
            super(name, mediator);
        }
        public void getMessage(String message){
            System.out.println("同事A"+name+"获得信息"+message);
        }
        //同事A与中介者通信
        public void contact(String message){
            mediator.contact(message, this);
        }
    }
    public class ColleagueB extends Colleague {
    
        public ColleagueB(String name, Mediator mediator) {
            super(name, mediator);
        }
        public void getMessage(String message){
            System.out.println("同事B"+name+"获得信息"+message);
        }
        //同事B与中介者通信
        public void contact(String message){
            mediator.contact(message, this);
        }
    }

    第四步:定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。

    //定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
    public class ConcreteMediator extends Mediator {
        ColleagueA collA;
        ColleagueB collB;
    
        public ColleagueA getCollA() {
            return collA;
        }
    
        public void setCollA(ColleagueA collA) {
            this.collA = collA;
        }
    
        public ColleagueB getCollB() {
            return collB;
        }
    
        public void setCollB(ColleagueB collB) {
            this.collB = collB;
        }
    
        @Override
        public void contact(String content, Colleague coll) {
            if (coll==collA) {
                collB.getMessage(content);
            } else {
                collA.getMessage(content);
            }
        }
    }

    第五步:定义Client,测试中介者模式的使用

    public class Client {
    
        /**
         * @param args
         */
        // 中介者,ColleagueA、ColleagueB
        public static void main(String[] args) {
            // 定义中介者
            ConcreteMediator mediator = new ConcreteMediator();
            // 定义具体同事类
            ColleagueA colleagueA = new ColleagueA("张三", mediator);
            ColleagueB colleagueB = new ColleagueB("李四", mediator);
            // 中介者知晓每一个具体的Colleague类
            mediator.setCollA(colleagueA);
            mediator.setCollB(colleagueB);
            colleagueA.contact("我是A,我要和同事B说说工作的事情");
            colleagueB.contact("我是B,我下午有时间,下午商量吧");
        }
    
    }

    运行结果:

    同事B李四获得信息:我是A,我要和同事B说说工作的事情
    同事A张三获得信息:我是B,我下午有时间,下午商量吧

    总结:
    中介者就是一个处于众多对象中间,并恰当地处理众多对象之间相互之间的联系的角色。以上代码中只有两个参与者类,但是这些我们都可以根据中介者模式的宗旨进行适当地扩展,即增加参与者类,然后中介者就得担负更加重的任务了,我们看到上面具体中介者类Mediator中的方法比较多而且有点乱。 所以,在解耦参与者类之间的联系的同时,中介者自身也不免任务过重,因为几乎所有的业务逻辑都交代到中介者身上了,可谓是“万众期待”的一个角色了。这就是中介者模式的不足之处了。此外,上面这个代码例子的参与者的属性和方法都是一样的,我们可以抽取一个抽象类出来,减少代码,但是有时候我们根本抽取不了多个“参与者”之间的共性来形成一个抽象类,这也大大增加了中介者模式的使用难度。 

  • 相关阅读:
    选择高性能NoSQL数据库的5个步骤
    如何将 Redis 用于微服务通信的事件存储
    让你的AI模型尽可能的靠近数据源
    Collections.sort 给集合排序
    Bootstrap 文件上传插件File Input的使用
    select2 api参数的文档
    textarea 标签换行及靠左
    JSON
    JDK的get请求方式
    通讯录作业
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5413958.html
Copyright © 2011-2022 走看看