中介者模式

作者: 咋家 | 来源:发表于2020-04-06 08:15 被阅读0次

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

    比如MVC模式,C(Controller控制器)是M(Mdel模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。

    中介者涉及到的角色主要有四种:

    Mediator:抽象中介者,定义了同事对象到中介者对象的接口

    Colleague:抽象同时类

    ConcreteMediator:具体的中介对象,实现抽象方法,需要知道所有的具体的同时类,即以一个集合来管理,并接收某个同事对象消息,完成相应的任务

    ConcreteColleague:具体的同时类,会有很多,每个同事只知道自己的行为,而不了解其它同事类的行为,但是它们都依赖中介者对象

    实际应用

    直接看一个需求,在一个智能家庭中,包括各种设备,闹钟,咖啡机,电视机等,当要看电视时,各个设备可以协同工作,自动完成看电视的准备工作。

    中介者相关代码

    public abstract class Mediator {
    
        //给中介者注册对象
        public abstract void register(String colleagueName, Colleague colleague);
        //接收具体同事对象发出的消息
        public abstract void getMessage(int stateChange, String colleagueName);
        public abstract void sendMessage();
    }
    
    class ConcreteMediator extends Mediator{
        //集合放入所有同事对象
        private HashMap<String, Colleague> colleagueHashMap;
        private HashMap<String, String> interMap;
        public ConcreteMediator(){
            colleagueHashMap=new HashMap<>();
            interMap=new HashMap<>();
        }
    
        @Override
        public void register(String colleagueName, Colleague colleague) {
            colleagueHashMap.put(colleagueName,colleague);
            if (colleague instanceof Alarm){
                interMap.put("Alarm",colleagueName);
            }
        }
    
        @Override
        public void getMessage(int stateChange, String colleagueName) {
            if (colleagueHashMap.get(colleagueName) instanceof Alarm){
                if (stateChange==0){
                    System.out.println("打开闹钟");
                }else if (stateChange==1){
                    System.out.println("关闭闹钟");
                }
            }
        }
    
        @Override
        public void sendMessage() {
    
        }
    }
    

    同事类相关代码

    public abstract class Colleague {
        private Mediator mediator;
        public String name;
        public Colleague(Mediator mediator, String name){
            this.mediator=mediator;
            this.name=name;
        }
    
        public Mediator getMediator(){
            return this.mediator;
        }
    
        public abstract void sendMessage(int stateChange);
    }
    
    class Alarm extends Colleague{
    
        public Alarm(Mediator mediator, String name) {
            super(mediator, name);
            mediator.register(name,this);
        }
    
        public void sendAlarm(int stateChange){
            sendMessage(stateChange);
        }
    
        @Override
        public void sendMessage(int stateChange) {
            this.getMediator().getMessage(stateChange,this.name);
        }
    }
    

    客户端

    public class Client {
        public static void main(String[] args) {
            ConcreteMediator concreteMediator = new ConcreteMediator();
            Alarm alarm = new Alarm(concreteMediator, "alarm");
    
            alarm.sendMessage(0);
        }
    }
    

    总结

    当多个类相互耦合形成网状结构,使用中介者模式可将网状结构分离为星型结构,进行解耦,减少了类之间的依赖,符合迪米特法则。

    但是中介者承担了较多的责任,一旦中介者出现问题,整个系统就会受到影响,因此要合理设计中介者,避免其过于复杂。

    往期回顾

    UML类图的六大关系
    八种单例模式分析
    由浅入深工厂模式
    原型模式及深浅拷贝详解
    建造者模式
    适配器设计模式
    桥接模式
    外观模式
    享元模式
    史上最全代理模式讲解
    模板方法
    命令模式
    访问者模式
    迭代器模式
    观察者模式

    更多精彩,关注“咋家”

    相关文章

      网友评论

        本文标题:中介者模式

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