设计模式——中介者模式

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

// 抽象中介者
public abstract class Mediator {

    // 抽象调度方法,在具体实现类中实现调度逻辑
    public abstract void contact(String content, Colleague colleague);

}

// 抽象同事类
public abstract class Colleague {

    // 同事名字
    protected String name;
    // 中介者
    protected Mediator mediator;

    // 同事对象创建时需接受中介者
    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    // 获取信息
    public abstract void getMessage(String message);

    // 发送通知
    public abstract void notify(String message);

}

// 同事类A
public class ConcreteColleagueA extends Colleague {

    // 构造函数接受中介者对象
    public ConcreteColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    public void getMessage(String message){
        System.out.println(name + "收到了信息,内容是: " + message);
    }

    // 与中介者联系
    @Override
    public void notify(String message){
        this.mediator.contact(message, this);
    }

}

// 同事类B
public class ConcreteColleagueB extends Colleague {

    // 构造函数接受中介者对象
    public ConcreteColleagueB(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    public void getMessage(String message){
        System.out.println(name + "收到了信息,内容是: " + message);
    }

    // 与中介者联系
    @Override
    public void notify(String message){
        this.mediator.contact(message, this);
    }

}

// 具体中介者
public class ConcreteMediator extends Mediator {

    // 中介类知道各个同事
    private Colleague colleagueA;
    private Colleague colleagueB;

    // 信息的调度,具体实现和业务有关
    @Override
    public void contact(String content, Colleague colleague) {
        if(colleague == colleagueA){
            // A通知B的内容,让B接收
            colleagueB.getMessage(content);
        }else if(colleague == colleagueB){
            // B通知A的内容,让A接收
            colleagueA.getMessage(content);
        }
    }

    public Colleague getColleagueA() {
        return colleagueA;
    }
    public void setColleagueA(Colleague colleagueA) {
        this.colleagueA = colleagueA;
    }
    public Colleague getColleagueB() {
        return colleagueB;
    }
    public void setColleagueB(Colleague colleagueB) {
        this.colleagueB = colleagueB;
    }

}

// 测试类
public class Test {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ConcreteColleagueA colA = new ConcreteColleagueA("张三", mediator);
        ConcreteColleagueB colB = new ConcreteColleagueB("李四", mediator);
        mediator.setColleagueA(colA);
        mediator.setColleagueB(colB);
        // 同事之间的通信不需要指定具体的对象,告诉中介即可
        colA.notify("我是张三,要找李四");
        colB.notify("我是李四");
    }

}

运行结果是:

李四收到了信息,内容是: 我是张三,要找李四
张三收到了信息,内容是: 我是李四

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及向定制一个分布在多个类中的行为,而又不想生成太多子类的场合。 中介者模式的主要优点在于简化了对象之间的交互,将各同事解耦,还可以减少子类生成,对于复杂的对象之间的交互,通过引入中介者,可以简化各同事类的设计和实现。

相关文章
相关标签/搜索