设计模式-行为型模式-中介者模式

83 阅读2分钟

中介者模式定义

中介者模式 Mediator Pattern是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

意图

通过中介将复杂的多对多的网状关系简化为星形关系,中间的节点就是中介。用户面临一个中介的业务,中介去实现复杂的调度关系。

应用实例

1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

2、机场调度系统。

3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

代码

定义一个抽象的中介接口,包含了中介的业务方法。

public interface Mediator {

    void register(Colleague colleague);

    void relay(Colleague  colleague);
}

具体的中介,以 QQ 平台为中介,实现了注册和发送信息的方法。

public class QqMediator implements Mediator{
    private List<Colleague> colleagueList = new ArrayList<>();


    @Override
    public void register(Colleague colleague) {
        if (!colleagueList.contains(colleague)){
            colleagueList.add(colleague);
            // 设置中介,建立联系
            colleague.setColleague(this);
        }
    }

    @Override
    public void relay(Colleague colleague) {
        colleagueList.forEach(c->{
            if (!c.equals(colleague)){
                c.receive();
            }
        });
    }
}

抽象的同事类

public abstract class Colleague {

    protected Mediator mediator;

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

    public abstract void receive();

    public abstract void send();
}

具体的同事

public class WangWu extends Colleague{
    @Override
    public void receive() {
        System.out.println("WangWu收到消息");
    }

    @Override
    public void send() {
        System.out.println("WangWu发送消息");
        System.out.println("中介代替转发中...");
        mediator.relay(this);
    }
}
public class ZhangSan extends Colleague{
    @Override
    public void receive() {
        System.out.println("ZhangSan收到消息");
    }

    @Override
    public void send() {
        System.out.println("ZhangSan发送消息");
        System.out.println("中介代替转发中...");
        mediator.relay(this);
    }
}
public class LiSi extends Colleague{
    @Override
    public void receive() {
        System.out.println("LiSi收到消息");
    }

    @Override
    public void send() {
        System.out.println("LiSi发送消息");
        System.out.println("中介代替转发中...");
        mediator.relay(this);
    }
}

客户端调用中介去发送消息

public class MediatorClient {
    public static void main(String[] args) {
        // 中介者
        Mediator mediator = new QqMediator();

        // 平台使用者
        Colleague zhangSan = new ZhangSan();
        Colleague liSi = new LiSi();
        Colleague wangWu = new WangWu();

        mediator.register(zhangSan);
        mediator.register(liSi);
        mediator.register(wangWu);

        // ZhangSan 发送消息
        zhangSan.send();
        liSi.send();
        wangWu.send();
    }
}

运行结果

image.png