中介者模式

2019-08-15  本文已影响0人  闽越布衣

描述

    中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

简介

    定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。


中介者类图

角色

优缺点

优点

缺点

使用场景

示例

/**
 * 抽象中介者(Mediator)角色
 */
public abstract class Mediator {
    public abstract void register(Colleague colleague);

    public abstract void relay(Colleague colleague);
}
/**
 * 具体中介者(ConcreteMediator)角色
 */
public class ConcreteMediator extends Mediator {
    private List<Colleague> colleagues = new ArrayList<Colleague>();

    @Override
    public void register(Colleague colleague) {
        if (!colleagues.contains(colleague)) {
            colleagues.add(colleague);
            colleague.setMediator(this);
        }
    }

    @Override
    public void relay(Colleague colleague) {
        for (Colleague object : colleagues) {
            if (!object.equals(colleague)) {
                object.receive();
            }
        }
    }
}
/**
 * 抽象同事类(Colleague)角色
 */
public abstract class Colleague {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void receive();

    public abstract void send();
}

/**
 * 具体同事类(Concrete Colleague)角色
 */
public class ConcreteColleagueA extends Colleague {
    @Override
    public void receive() {
        System.out.println("具体同事类A收到请求。");
    }

    @Override
    public void send() {
        System.out.println("具体同事类A发出请求。");
        mediator.relay(this);
    }
}

/**
 * 具体同事类(Concrete Colleague)角色
 */
public class ConcreteColleagueB extends Colleague {
    @Override
    public void receive() {
        System.out.println("具体同事类B收到请求。");
    }

    @Override
    public void send() {
        System.out.println("具体同事类B发出请求。");
        mediator.relay(this);
    }
}
/**
 * 客户端角色
 */
public class Client {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();
        Colleague colleagueA, colleagueB;
        colleagueA = new ConcreteColleagueA();
        colleagueB = new ConcreteColleagueB();
        mediator.register(colleagueA);
        mediator.register(colleagueB);
        colleagueA.send();
        colleagueB.send();
    }
}
上一篇下一篇

猜你喜欢

热点阅读