设计模式——中介者模式

Posted boycelee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——中介者模式相关的知识,希望对你有一定的参考价值。

  • 中介者模式定义
    中介者对象封装系列的对象交互,中介者使得对象不需要显示地相互作用,从而松耦合,能够独立改变它们之间的交互。

  • 中介者模式角色
    抽象中介者: 用于各个同事类之间的通信,同事类对象到中介者对象的接口。包括一个或几个抽象的事件方法,由子类实现。
    中介者实现类: 从一个同事类接收消息,通过消息影响其他同事类
    同事类: 如果一个对象会影响其他类,同时也会被其他类影响,这两个类互为同事类。

  • 使用中介者模式的原因
    一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。

    在使用了中介者模式之后,同事类之间关系变成星型结构,由专门的类统一管理他们之间的关系。

  • UML 图

技术分享图片

  • 中介者模式例子
    相对于机票购买这件事来说,客户、各航司、各代理商之间其实就有错综复杂。而去哪网的出现目标就是将这些错综复杂的关系整合,以去哪儿网平台为核心,呈现一个星型结构。
    public class User {

    /**
     * 用户名称
     */
    protected String name;

    /**
     * 中介者
     */
    protected Mediator mediator;

    public User(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Mediator getMediator() {
        return mediator;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}
    public class Visitor extends User {


    public Visitor(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 与中介者联系
     *
     * @param message
     */
    public void constact(String message) {
        mediator.constact(message, this);
    }

    public void getMessage(String message) {
        System.out.println("访问者:" + name + ",获取信息:" + message);
    }
}
    public class Agents extends User {

    public Agents(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 与中介者联系
     *
     * @param message
     */
    public void constact(String message) {
        mediator.constact(message, this);
    }

    public void getMessage(String message) {
        System.out.println("代理商:" + name + ",获取信息:" + message);
    }
}
    public interface Mediator {

    void constact(String message,User user);
}
    public class MediatorStructure implements Mediator {

    /**
     * 代理商
     */
    private Agents agents;

    /**
     * 用户
     */
    private Visitor visitor;


    public Agents getAgents() {
        return agents;
    }

    public void setAgents(Agents agents) {
        this.agents = agents;
    }

    public Visitor getVisitor() {
        return visitor;
    }

    public void setVisitor(Visitor visitor) {
        this.visitor = visitor;
    }

    public void constact(String message, User user) {
        //如果是代理商,则访问者获得信息
        if (user == agents) {
            visitor.getMessage(message);
        } else {
            agents.getMessage(message);
        }
    }
}
    public class Client {

    public static void main(String[] args) {

        MediatorStructure mediator = new MediatorStructure();

        Agents agents = new Agents("xxx机票代理商", mediator);
        Visitor visitor = new Visitor("李四", mediator);
        mediator.setAgents(agents);
        mediator.setVisitor(visitor);

        agents.constact("听说便宜机票.....");
        visitor.constact("是的,需要机票吗?");

    }

}
  • 优点
    1、 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合系统。

    2、 减少了子类的生成。

    3 、 可以减少各同事类的设计与实现。

  • 缺点
    由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。

  • 适用场景
    1、 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系结构混乱而且难以复用该对象。

    2、 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。










以上是关于设计模式——中介者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之中介者模式

设计模式----中介者模式及简单总结(2018/10/30)

(十九)中介者模式-代码实现

设计模式之中介者模式

设计模式之中介模式与解释器模式详解和应用

20160227.CCPP体系详解(0037天)