zoukankan      html  css  js  c++  java
  • Java 设计模式系列(十七)中介者模式

    Java 设计模式系列(十七)中介者模式

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

    一、中介者模式结构

    图17-1 中介者模式结构

    • Mediator: 中介者接口。在里面定义各个同事之间交互需要的方法,可以是公共的通讯方法,比如changed方法,大家都用,也可以是小范围的交互方法。

    • ConcreteMediator: 具体中介者实现对象。它需要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。

    • Colleague: 同事类的定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如:每个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,就可以定义到这个类里面。

    • ConcreteColleague: 具体的同事类,实现自己的业务,在需要与其它同事通讯的时候,就与持有的中介者通信,中介者会负责与其它的同事交互。

    源代码

    (1) Colleague

    /**
     * 同事类的抽象父类
     */
    public abstract class Colleague {
        /** 持有中介者对象,每一个同事类都知道它的中介者对象 */
        private Mediator mediator;
    
        /** 构造方法,传入中介者对象 */
        public Colleague(Mediator mediator) {
            this.mediator = mediator;
        }
    
        /** 获取当前同事类对应的中介者对象 
        public Mediator getMediator() {
            return mediator;
        }
    
    }
    
    public class ConcreteColleagueA extends Colleague {
    
        public ConcreteColleagueA(Mediator mediator) {
            super(mediator);
        }
    
        /** 示意方法,执行某些业务功能 */
        public void someOperation() {
            //在需要跟其它同事通信的时候,通知中介者对象
            getMediator().changed(this);
        }
    
    }
    
    public class ConcreteColleagueB extends Colleague {
    
        public ConcreteColleagueB(Mediator mediator) {
            super(mediator);
        }
    
        /** 示意方法,执行某些业务功能 */
        public void someOperation() {
            //在需要跟其它同事通信的时候,通知中介者对象
            getMediator().changed(this);
        }
    
    }
    

    (2) Mediator

    /**
     * 中介者,定义各个同事对象通信的接口
     */
    public interface Mediator {
    
        /**
         * 同事对象在自身改变的时候来通知中介者的方法,
         * 让中介者去负责相应的与其它同事对象的交互
         * @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态
         */
        public void changed(Colleague colleague);
    
    }
    
    public class ConcreteMediator implements Mediator {
    
        /** 持有并维护同事A */
        private ConcreteColleagueA colleagueA;
    
        /** 持有并维护同事B */
        private ConcreteColleagueB colleagueB;
    
        /** 设置中介者需要了解并维护的同事A对象 */
        public void setConcreteColleagueA(ConcreteColleagueA colleague) {
            colleagueA = colleague;
        }
    
        /** 设置中介者需要了解并维护的同事B对象 */
        public void setConcreteColleagueB(ConcreteColleagueB colleague) {
            colleagueB = colleague;
        }
    
        public void changed(Colleague colleague) {
            //某个同事类发生了变化,通常需要与其它同事交互
            //具体协调相应的同事对象来实现协作行为
        }
    
    }
    

    二、总结

    (1) 中介者模式的本质

    解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

    (2) 中介者模式的应用

    • MVC 模式(其中的 C,控制器就是一个中介者对象。M 和 V 都和他打交道)

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    零散杂记
    Result || IResult
    策略模式
    unity中的WWW通讯问题
    在webView 中使用JS 调用 Android / IOS的函数 Function
    不同云区域Proxy安装错误记录
    标准运维加载插件
    蓝鲸考试模拟
    PAAS组件迁移
    脚本安装halo
  • 原文地址:https://www.cnblogs.com/binarylei/p/9016211.html
Copyright © 2011-2022 走看看