• 设计模式-中介者模式


    定义

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

    mediator

    软件开发中,通过提供一个统一的接口让系统不同部分进行通信。一般,如果系统有很多子模块需要直接沟通,都要创建一个中央控制点让其各模块通过中央控制点进行交互。中介者模式可以让这些子模块不需要直接沟通,从而达到进行解耦的目的。在现实生活中,有很多中介者模式的身影,例如二手车平台、婚姻中介和房产中介,通过平台方介入进行协调供需之间的关系。

    中介者模式的结构

    中介者模式有如下角色:

    • Mediator
      中介者定义一个接口用于与各同事(Colleague)对象通信。
    • ConcreteMediator
      具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
    • Colleague
      抽象同事类。
    • Colleagueclass
      具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

    中介者模式的实现

    定义抽象Mediator:

    public abstract class Mediator {
    	public abstract void notice(String content,Colleague coll);
    }
    
    • 1
    • 2
    • 3

    定义抽象同事Colleague:

    public abstract class Colleague {
        protected String name;
        protected Mediator mediator;
    
        public Colleague(String name, Mediator mediator) {
            this.name = name;
            this.mediator = mediator;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了。

    public class ColleagueA extends Colleague {
        public ColleagueA(String name, Mediator mediator) {
            super(name, mediator);
        }
        public void getNotice(String message){
            System.out.println("同事A"+name+"获得信息"+message);
        }
        //同事A与中介者通信
        public void contact(String message){
            mediator.notice(message, this);
        }
    }
    public class ColleagueB extends Colleague {
    
        public ColleagueB(String name, Mediator mediator) {
            super(name, mediator);
        }
        public void getNotice(String message){
            System.out.println("同事B"+name+"获得信息"+message);
        }
        //同事B与中介者通信
        public void contact(String message){
            mediator.notice(message, this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

    @Data
    public class ConcreteMediator extends Mediator {
        ColleagueA collA;
        ColleagueB collB;
    
        @Override
        public void notice(String content, Colleague coll) {
            if (coll == collA) {
                collB.getNotice(content);
            } else {
                collA.getNotice(content);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    定义中介者与具体同事类,中介者知晓每一个具体的Colleague类。

    public class Client {
        // 中介者,ColleagueA、ColleagueB
        public static void main(String[] args) {
            ConcreteMediator mediator = new ConcreteMediator();
            ColleagueA colleagueA = new ColleagueA("A", mediator);
            ColleagueB colleagueB = new ColleagueB("B", mediator);
            mediator.setCollA(colleagueA);
            mediator.setCollB(colleagueB);
            colleagueA.contact("我是A,我要联系B!");
            colleagueB.contact("我是B,收到A消息!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    总结

    中介者模式简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。并且提供系统的灵活性,使得各个同事对象独立而易于复用。

    其缺点也很明显:

    • 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
    • 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

    中介者模式适用于当对象之间的交互变多时,为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。

  • 相关阅读:
    独立站谷歌付费广告关键词选词技巧实操
    golang学习笔记——切片
    信息学奥赛一本通:1153:绝对素数
    IT基础监控的全面解决方案
    21【JDBC操作数据库元数据】
    学习-Java输入输出之数据IO流之向文件中写入数字并读取
    大数据算法系列10:字符串检验算法
    CSS伪类选择器与浮动
    How to clean up Graylog Default index set log
    如果有些字段不想进行序列化怎么办?
  • 原文地址:https://blog.csdn.net/qq_42583549/article/details/133977339