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 都和他打交道)

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

posted on 2018-05-09 19:42  binarylei  阅读(181)  评论(0编辑  收藏  举报

导航