zoukankan      html  css  js  c++  java
  • 中介者模式-Mediator

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

    一、类图

    中介者模式主要包含如下几个角色:

    • Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。
    • ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
    • Colleague: 抽象同事类。
    • ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

    二、示例

    Mediator : 为 Colleague 对象定义一个交流接口。

    abstract class Mediator {
        public abstract void Send(String message, Colleague colleague);
    }

    ConcreteMediator : 实现 Mediator 中的交流接口。 这个类中需要了解并维护所有的 colleague 对象。

    class ConcreteMediator extends Mediator {
    
        private ConcreteColleague1 colleague1;
        private ConcreteColleague2 colleague2;
    
        public void setColleague1(ConcreteColleague1 colleague1) {
            this.colleague1 = colleague1;
        }
    
        public void setColleague2(ConcreteColleague2 colleague2) {
            this.colleague2 = colleague2;
        }
    
        @Override
    
        public void Send(String message, Colleague colleague) {
            if (colleague == colleague1) {
                colleague2.Notify(message);
            } else if (colleague == colleague2){
                colleague1.Notify(message);
            } else {
                System.out.println("Error!");
            }
        }
    }

    Colleague组 : 每个 Colleague 对象应该知道它的 Mediator 对象,但不知道其他同事对象。它只能联系 Mediator 对象。

    abstract class Colleague {
    
        protected Mediator mediator;
    
        public Colleague(Mediator mediator) {
            this.mediator = mediator;
        }
    
        public void Send(String message) {
            mediator.Send(message, this);
        }
    
        public abstract void Notify(String message);
    
    }
    
    class ConcreteColleague1 extends Colleague {
    
        public ConcreteColleague1(Mediator mediator) {
            super(mediator);
    
        }
    
        @Override
        public void Notify(String message) {
            System.out.println("同事1得到信息:" + message);
        }
    
    }
    
    class ConcreteColleague2 extends Colleague {
    
        public ConcreteColleague2(Mediator mediator) {
            super(mediator);
        }
    
        @Override
        public void Notify(String message) {
            System.out.println("同事2得到信息:" + message);
        }
    
    }

    测试

    public class MediatorPattern {
    
        public static void main(String[] args) {
            ConcreteMediator mediator = new ConcreteMediator();
            ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
            ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
    
            mediator.setColleague1(colleague1);
            mediator.setColleague2(colleague2);
    
            colleague1.Send("How are you?");
            colleague2.Send("Fine, thank you. And you?");
            colleague1.Send("I'm fine. Thankes.");
        }
    
    }

    三、优缺点

    优点:
    1、 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合系统。
    2、 减少了子类的生成。
    3、 可以减少各同事类的设计与实现。

    缺点:
    由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。

    四、SpringMVC中的中介者模式

    中介者模式也叫做调停者模式,是什么意思呢?一个对象要和N多个对象交流,就像对象间的战争,很混乱。这时,需要加入一个中心,所有的类都和中心交流,中心说怎么处理就怎么处理。使用过Struts2,SpringMVC框架,我们就应该知道其中的C(Controller)就是一个中介者,叫做前端 控制器,它的作用就是把M(Model,业务逻辑)和V(View,视图)隔离开, 协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少 M和V的依赖关系。MVC框架已经成为一个非常流行、成熟的开发框架,这也是中介者模式 的优点的一个体现。

    ……更多设计模式的内容,可以访问Refactoring.Guru

  • 相关阅读:
    #include <sys/stat.h>的作用
    如何使用SecureCRT连接vmware下ubuntu
    64位CentOS安装32位开发环境编译Nachos
    Apache安装完服务没有安装的情况
    Java实现八皇后
    动态规划初级练习(二):BadNeighbors
    打造你的办公环境-email篇
    IRC配置for open source community
    static wechat red package tool
    Trafic control 大框图(HTB )
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/11761069.html
Copyright © 2011-2022 走看看