简介

定义:用一个【中介者对象】封装一系列的【对象交互】,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

中介者模式的结构
  • 抽象中介者Mediator:定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法
  • 具体中介者ConcreteMediator:实现抽象中介者中定义的方法,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系
  • 同事类Colleague:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类;在实际应用中,同事类可能由多个组成,他们之间相互影响,相互依赖;同事类也可以表现为继承了同一个抽象类的一组实现组成;在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
  • 具体同事类ConcreteColleague:实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。

中介者模式的优点
  • 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用
  • 降低了系统对象之间的耦合性,使得对象易于独立的被复用
  • 提高系统的灵活性,使得系统易于扩展和维护
  • 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护
  • 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用
适用场景
  • 在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。
  • 一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。
  • 使用中介者模式,可以将网状结构变为星状结构(星状结构的中心当然是中介者啦),使同事类之间的关系变的清晰一些。
  • 中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()

演示

/**抽象同事类Colleague,同事类之间必须通过中介者才能进行消息传递*/
public abstract class Colleage {
    protected String name;
    protected Mediator mediator;
    Colleage(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
    /**与中介者联系*/
    public abstract void constact(String message);
    /**获取信息 */
    public abstract void getMessage(String message);
}
//房东,具体同事类******************************************************************************************
class HouseOwner extends Colleage {
    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    @Override
    public void constact(String message) {
        mediator.constact(message, this);//需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互
    }
    @Override
    public void getMessage(String message) {
        System.out.println("房主" + name + "收到中介发的消息:\n        " + message);
    }
}
//房客******************************************************************************************
class Tenant extends Colleage {
    Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    /**与中介者联系*/
    @Override
    public void constact(String message) {
        mediator.constact(message, this);
    }
    /**获取信息*/
    @Override
    public void getMessage(String message) {
        System.out.println("租房者" + name + "收到中介发的消息:\n        " + message);
    }
}

/**抽象中介者,定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法 */
public abstract class Mediator {
    /**申明一个房东和租客之间联络的方法*/
    public abstract void constact(String message, Colleage colleage);
}
/**具体中介者,实现抽象中介者中定义的方法,它需要维护每个同事对象,并负责具体的协调各个同事对象的交互关系*/
class MediatorStructure extends Mediator {
    private HouseOwner houseOwner; //中介者必须知道房主和租房者的信息
    private Tenant tenant;
    public HouseOwner getHouseOwner() {
        return houseOwner;
    }
    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }
    public Tenant getTenant() {
        return tenant;
    }
    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }
    @Override
    public void constact(String message, Colleage colleage) {
        if (colleage == houseOwner) tenant.getMessage("你好,我是中介,我收到房东" + tenant.name + "的出租消息,内容为【" + message + "】");
        else houseOwner.getMessage("你好,我是中介,我收到房客" + colleage.name + "的求租消息,内容为【" + message + "】");
    }
}

public class Test {
    public static void main(String[] args) {
        //一个房主、一个租房者、一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("煞笔", mediator);
        Tenant tenant = new Tenant("包青天", mediator);
        //中介结构要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);
        tenant.constact("黑中介你好,请问你那里有没有二室一厅的房要出租?");
        houseOwner.constact("有的,房租只要8000一月,很便宜吧!");
        tenant.constact("滚粗");
        houseOwner.constact("呵呵,还有一间一室一厅的房子,只要200块,要租不?");
        tenant.constact("滚蛋");
    }
}


附件列表

Mediator 中介者 协调者模式的更多相关文章

  1. C++设计模式-Mediator中介者模式

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  2. 设计模式 ( 十六 ): Mediator中介者模式 -- 行为型

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象 ...

  3. 设计模式16:Mediator 中介者模式(行为型模式)

    Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...

  4. Mediator(中介者)-对象行为型模式

    1.意图 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 2.动机 通过将集体行为封装在一个单独的中介者对象中,中介者 ...

  5. 设计模式学习之中介者模式(Mediator,行为型模式)(18)

    转载地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信 ...

  6. 设计模式(17)--Mediator(中介者模式)行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以 ...

  7. Mediator - 中介者模式

    定义 用一个中介对象来封装一系列的对象的交互.中介者使各对象不须要显示地相互使用,从而使其耦合松散,并且能够独立的改变他们之间的交互. 案例 比方有一个图像界面,在界面上有一个输入框LineEdit, ...

  8. 设计模式学习笔记——Mediator中介者模式

    将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式:

  9. Mediator 中介者 MD

    中介者模式 简介 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介者模式也称为调解者模式或者调停者模式. 当程序存在大 ...

随机推荐

  1. Day12 线程池、RabbitMQ和SQLAlchemy

    1.with实现上下文管理 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: wanghuafeng #with实现上下文管理import c ...

  2. ps批量修改图片

    批量更改图片尺寸的ps脚本 高端干货!PHOTOSHOP实用脚本大合集

  3. [转载]网络编辑必知常识:什么是PV、UV和PR值 zz

    1.什么是pv PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网 ...

  4. BZOJ 1492 货币兑换

    Description Input 第一行两个正整数\(N,S\),分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来\(N\)行,第\(K\)行三个实数\(A_{K},B_{K},Rate_{ ...

  5. 谈谈react-router学习

    源网页 http://qiutc.me/post/%E8%B0%88%E8%B0%88-react-router.html React + webpack 爽的飞起,少了点什么. 多页面,每次请求页面 ...

  6. Instagram的技术架构

    http://blogread.cn/it/article/5497 Instagram 被 Facebook 以10亿美金收购.团队规模:13 人.而在被Facebook收购前的一个月,整个团队才7 ...

  7. Java Integer类分析

    public static final int   MIN_VALUE = 0x80000000;  -2^31 public static final int   MAX_VALUE = 0x7ff ...

  8. bzoj2096

    本来也不打算写这道题的解题报告的,因为比较水直接维护两个单调队列(最大值,最小值)随便弄弄就行了但是我开始疯狂不知道为什么的RE,然后实在没办法找root要了数据测了之后……王苍,根本就没有错啊……我 ...

  9. 【转】java参数传递(超经典)

    原文网址:http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)” ...

  10. iconv gbk字符转utf8字符

    直接上代码 bool gbk2utf8(const char* src, char* dest, size_t inlen) { const char *inbuf = src; size_t out ...