第七章———中介者模式

又到了周五了,日子过得好快,年龄又大了,又是一年光棍节;我的爱情在那里呢?剩下的只有美好的回忆,感觉内心麻木了找不回23岁时的激情;只有赚钱能使我感到快乐;不管怎么样,路还得继续走;内心的追求继续;也许有一天我开悟了;往事就都犹如过眼云烟了吧;今天我们继续修炼内功,看一下中介者模式。
定义:
Define an object that encapsulates how a set of objects
interact.Mediator promotes loose coupling by keeping objects from referring to each other
explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象
交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它
们之间的交互。)
我们先看下通用的类图:

图片.png

Mediator 中介者的抽象,
ConcreteMediator具体抽象者
Colleaque 同事类;
我们可以理解为同事之间工作交流必有相互的工作交集,那么作为架构师要想的是要减少这些交集,以降低耦合或者说松散耦合;因此可以用一个寻找一个中介ConcreteMediator来协助我们沟通交流;
其实很简单,像我们Android开发比较流行的架构模式Mvp模式我们是不是也可以这样理解成是一种中介者模式呢;或者说是网络拓扑中的星型拓扑结构;
下面我们在具体代码中做下验证:好了我们写个Demo;
老夫当年在北京混的时候,租房被中介坑过1500大洋;至今耿耿于怀;但是现在大城市很少有那种城中村张贴租房广告的了,城市在发展岂能容忍小广告横行,这算是老夫刚出道交的学费吧;据说马云横刀跃马杀入租房市场,支付宝也能租房了而且免押金哦;唉,这让中介怎么活?好了不扯淡了我们就写个租房的例子。

          package com.ldl.mediatortest;

                /**
             * @author deling 2017年11月3日 抽象用户类
             */
          public abstract class Colleague {
 protected HouseMediator mediator;

public Colleague(HouseMediator mediator) {
    super();
    this.mediator = mediator;
}

    }

这是我们定义的同事类的统一抽象接口;

                     /**
         * 
       */
    package com.ldl.mediatortest;

               /**
         * @author deling 2017年11月3日
          */
     // 定义一个房东类
        public class Landlord extends Colleague {

private String name;

public Landlord(HouseMediator mediator, String name) {
    super(mediator);
    this.name = name;
}

public void say() {
    System.out.println("你好我叫" + name + "我这有一套三室一厅出租");
}

public void houseoffer() {
    System.out.println("我报价3000押一付一");
}
      }

这是我们实现的一个房东类:

              /**
         * 
             */
        package com.ldl.mediatortest;

           /**
          * @author deling 2017年11月3日 具体租户
        */
       public class ColleagueImpl extends Colleague {

public ColleagueImpl(HouseMediator mediator, String name) {
    super(mediator);
    this.name = name;
}

private String name;

public void tenantSay() {
    System.out.println("你好我是" + name + "我准备租套房子3室一厅的就行");
}

    }

这是我们实现的具体租户;好了下面搞一个中介玩玩;

             package com.ldl.mediatortest;

      /**
        * @author deling 2017年11月3日 抽象中介
          */
       public abstract class HouseMediator {
      protected Landlord landlord;

protected ColleagueImpl tenant;
public Landlord getLandlord() {
    return landlord;
}

public void setLandlord(Landlord landlord) {
    this.landlord = landlord;
}

public ColleagueImpl getTenant() {
    return tenant;
}

public void setTenant(ColleagueImpl tenant) {
    this.tenant = tenant;
         }



public abstract void landlordSay();

public abstract void houseoffer();

public abstract void tenantSay();

   }

这是一个中介的抽象,下面再搞个具体中介

        package com.ldl.mediatortest;

       /**
          * @author deling 2017年11月3日
       */
        public class HouseMediatorInfo extends HouseMediator {

/*
 * (non-Javadoc)
 * 
 * @see com.ldl.mediatortest.HouseMediator#landlordSay()
 */
@Override
public void landlordSay() {
    super.landlord.say();

}

/*
 * (non-Javadoc)
 * 
 * @see com.ldl.mediatortest.HouseMediator#houseoffer()
 */
@Override
public void houseoffer() {
    // TODO Auto-generated method stub
    super.landlord.houseoffer();
}

/*
 * (non-Javadoc)
 * 
 * @see com.ldl.mediatortest.HouseMediator#tenantSay()
 */
@Override
public void tenantSay() {
    // TODO Auto-generated method stub
    super.tenant.tenantSay();

}

   }

好了测试一下:

        package com.ldl.mediatortest;

      /**
         * @author deling 2017年11月3日
       */
     public class MediatorTest {

/**
 * @param args
 */
public static void main(String[] args) {
    // 定义一个中介
    HouseMediator houseMediator = new HouseMediatorInfo();
    Landlord landlord = new Landlord(houseMediator, "二房东");
    ColleagueImpl tenant = new ColleagueImpl(houseMediator, "darling");
    // 中介绑定两个客户
    houseMediator.setLandlord(landlord);
    houseMediator.setTenant(tenant);
    landlord.say();
    tenant.tenantSay();
    landlord.houseoffer();

}

    }
图片.png

仔细观测你会发现我们的客户与房东之间的交互都是通过中介者来完成的;但是我们必须正确运用,当我们发现具体业务关联很多我们很难理清关系时就应该考虑使用中介作为媒介;前面我们也说了 MVP架构模式或者MVC架构都可以看作是中介者模式的运用;
总结一下:
缺点:
中介者模式的缺点就是中介者会膨胀得很大,而且逻辑复杂,原本N个对象直接的相互
依赖关系转换为中介者和同事类的依赖关系,同事类越多,中介者的逻辑就越复杂;所以说我们一般情况下Android开发中一个activity对应一个中介presenter;除非有通用功能可以抽取到一个presenter中供其它界面使用;
优点:
中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,
同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合

好了我们又搞清楚了一个设计模式;功力是不是又深厚了一层呢?其实学习和运用是两码事;在实践中应该多思考怎么写最好什么模式最好,达到运用自如信手拈来的时候,就可以吹牛逼了。下面是我重新做的一个比较完善的UML图:

图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容