设计模式《中介者模式》

引言

  先回顾一下上一节的桥接模式,我们这节来看看中介者模式。见问识意,就类似中介,在帝都租房,房产中介到处都是,随去可见。

示例地址

  Demo

类图

image

定义

  中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象字小尺度的行为上与其他对象的相互作用分开处理。

使用场景

  当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采用中介者模式,来解决紧耦合问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调用者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。

中介者模式示例

  小明毕业来到帝都,首先肯定有找房子,人生地不熟的,只能依靠中介找房子。像什么我爱我家、链家等等。王大爷,帝都的本地人,各个手上几套房子,都是土豪级别,没事就爱出去旅个游什么的。自己的房子也不管理,直接脱手给中介,图个省事,反正不差钱。这就是很常规的中介者模式。
  突然又想到一个例子,农村相亲时,男女双方都不认识,靠的就是中间的媒婆,这也是典型的中介者模式。

1. 先定义一个小明和王大爷公有的类
/**
 * 交易的接口
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午3:40.
 */
public abstract class Deal {
    protected IMediator mMediator;

    public Deal(IMediator mediator) {
        mMediator = mediator;
    }

    protected abstract void sendMessage(String message);

    protected abstract void receiveMessage(String message);

}
2. 小明(买家,租户)
/**
 * 小明想租房子
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午5:05.
 */
public class XiaoMing extends Deal {

    public XiaoMing(IMediator mediator) {
        super(mediator);
    }

    @Override
    protected void sendMessage(String message) {
        System.out.println("小明:告诉房产中介" + message);
        mMediator.notice(this, message);
    }

    @Override
    protected void receiveMessage(String message) {
        System.out.println("小明收到房产中介一条消息:" + message);
    }
}
3. 王大爷(出租户,房东)
/**
 * 王大爷想出租自己的房子
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午5:05.
 */
public class WangDaYe extends Deal {
    public WangDaYe(IMediator mediator) {
        super(mediator);
    }

    @Override
    protected void sendMessage(String message) {
        System.out.println("王大爷:告诉房产中介" + message);
        mMediator.notice(this, message);
    }

    @Override
    protected void receiveMessage(String message) {
        System.out.println("王大爷收到房产中介一条信息:" + message);
    }
}
4. 中介接口
/**
 * 中介的接口
 *
 * @author 512573717@qq.com
 * @created 2018/7/30  下午3:42.
 */
public interface IMediator {

    void notice(Deal deal, String message);

}
5. 房产中介(链家 我爱我家)
/**
 * 房产中介
 *
 * @author 512573717@qq.com
 * @created 2018/7/31  上午10:20.
 */
public class FangChanMediator implements IMediator {

    private XiaoMing mXiaoMing;

    private WangDaYe mWangDaYe;

    public void setBuyer(XiaoMing buyer) {
        mXiaoMing = buyer;
    }

    public void setSeller(WangDaYe seller) {
        mWangDaYe = seller;
    }

    @Override
    public void notice(Deal deal, String message) {
        System.out.println("中介收到消息 开始匹配");
        if (deal == mXiaoMing) {
            mWangDaYe.receiveMessage(message);
        } else {
            mXiaoMing.receiveMessage(message);
        }
    }
}
6. Client
 // 房产中介
 FangChanMediator fangChanMediator = new FangChanMediator();
 //小明想租房
 XiaoMing xiaoMing = new XiaoMing(fangChanMediator);
 //王大爷想出租自己的房子
 WangDaYe wangDaYe = new WangDaYe(fangChanMediator);


 fangChanMediator.setBuyer(xiaoMing);
 fangChanMediator.setSeller(wangDaYe);

 xiaoMing.sendMessage("我要租一个一室一厅的房子");
 System.out.println("======================");
 wangDaYe.sendMessage("我要出租我这个一室一厅的房子");

总结

  优点
  1. 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
  2. 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
  3. 使用中介者模式可以将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。
  缺点
  1. 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
  2. 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容

  • 目录 本文的结构如下: 引言 什么是中介者模式 模式的结构 典型代码 代码示例 优点和缺点 适用环境 模式应用 一...
    w1992wishes阅读 1,115评论 0 4
  • 意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改...
    tomas家的小拨浪鼓阅读 1,128评论 0 0
  • 在阎宏博士的《JAVA与模式》一书中开头是这样描述调停者(Mediator)模式的:调停者模式是对象的行为模式。调...
    Ant_way阅读 614评论 0 0
  • 1.中介者模式的定义及使用场景定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使...
    GB_speak阅读 375评论 0 0
  • 昨天是母上大人生日,仅仅一个短信,一个电话,已让大人开心无比。想想今年已是离家在外的第十一个年头了,从最初不舍...
    珊珊Lau阅读 371评论 0 0