码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——中介者模式

时间:2018-03-31 20:34:09      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:中间   string   通信   mediator   分享   目标   便宜   set   引用关系   

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

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

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

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

  • 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、 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

设计模式——中介者模式

标签:中间   string   通信   mediator   分享   目标   便宜   set   引用关系   

原文地址:https://www.cnblogs.com/boycelee/p/8683630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!