简介

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

中介者模式的结构
  • 抽象中介者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. OC 之 谓词

    NSPredicate 分类: Objective-C iOS XCode Mac2012-10-26 17:26 10557人阅读 评论(1) 收藏 举报 简述:Cocoa框架中的NSPredica ...

  2. python学习的一些感悟

    首先声明,这里用到的库是在coursera上学习时,老师建立的一个库 #timer import simplegui import random # global state message = &q ...

  3. gulp配置browserify多入口

    需要 var es = require('event-stream'); gulp.task('browserify', function(){ var files = [ { fpath: './j ...

  4. 工作总结:qsort函数用法

    qsort(&g_AMTBuf[g_dwAMTLenth], m_nCount, sizeof(12), Compare); 参数说明: 1.待排序数组首地址: 2.数组中待排序元素数量: 3 ...

  5. PLSQL 看连接数据库的用户

    1. PLSQL选用SYSDBA登录,用户sys,密码xxx 2. 登录后,点tools菜单有sessions子菜单, 3.点击sessions子菜单,可以看到连接用户

  6. AOP小结

    AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...

  7. bzoj3744

    这道题是目前我做bzoj最感动的一题没有之一……首先先警示一下,分块的题目能不套主席树尽量不套因为主席树不仅回答来一个log而且常数也比较大,对于分块这种根号的算法非常不适合这里是求区间逆序对,考虑查 ...

  8. Linux Kernel 'dispatch_discard_io()'安全绕过漏洞

    漏洞版本: Linux Kernel 漏洞描述: Bugtraq ID:60414 CVE ID:CVE-2013-2140 Linux是一款开源的操作系统. 由于不充分的检查BLKIF_OP_DIS ...

  9. gif动画问题

    iOS没有自带支持显示gif动画的功能,  用UIImageView的animationImage虽然可以实现图片动画, 当毕竟不方便. http://blog.stijnspijker.nl/200 ...

  10. (转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据

    (转载)http://blog.163.com/dreamman_yx/blog/static/26526894201053115622827/ 查询 今天 select * from 表名 wher ...