13、仲裁者模式(Mediator Pattern)

1. 仲裁者模式

1.1 简介

  仲裁者模式又称为调停者模式或中介者模式,主要是仲裁和中介的作用,帮助其它类之间进行通信,降低多个对象和类之间的通信复杂性。主要包括仲裁者(Mediator)和组员(Colleague),组员的动作需要会向仲裁者汇报,仲裁者会根据全局的实际情况向其他Colleague作出指示,共同完成一定的逻辑功能。仲裁者通常处理不同类之间的通信,并支持松耦合,使代码易于维护。作为行为型的模式之一,应用场景有限并不被大家熟知。

1.2 仲裁者结构

仲裁者uml:

仲裁者uml.jpg

仲裁者成员:

  • 抽象仲裁者(mediator):定义一个接口用于和对象通信(SmartDevice)
  • 具体仲裁者(concretemediator):协调各同事对象实现协作,了解维护各个同事()
  • 抽象同事角色(colleague):规定了同事的基本类型
  • 具体同事角色(concreteColleague):每个同事都知道仲裁者对象,要与同事通信则把通信告诉仲裁者

2. 示例

  我们以房屋出租为例,房东通过中介将房子租给租客,直接从中介处拿到租金,租客通过中介找到房东进行维修,同时物业通过中介向房东收取物业费。在此例中,中介相当于仲裁者或者中介者,房东、租客和物业就是组员,组员之间通过中介进行通信,实现收租、维修、收物业费等动作。

仲裁者接口类:

public interface Mediator {

    void collectRents(int money);
    void repair();
    void collectPropertyFee(int money);
}

房屋中介:

public class HouseMediator implements Mediator {

    private Person houseRenter;
    private Person renter;
    private Person property;

    public HouseMediator(Person houseRenter, Person renter,
        Person property) {
        this.houseRenter = houseRenter;
        this.renter = renter;
        this.property = property;
    }

    @Override
    public void collectRents(int money) {

    }

    public void repair() {

    }

    @Override
    public void collectPropertyFee(int money) {

    }

    public Person getHouseRenter() {
        return houseRenter;
    }

    public void setHouseRenter(Person houseRenter) {
        this.houseRenter = houseRenter;
    }

    public Person getRenter() {
        return renter;
    }

    public void setRenter(Person renter) {
        this.renter = renter;
    }

    public Person getProperty() {
        return property;
    }

    public void setProperty(Person property) {
        this.property = property;
    }
}

组员虚拟类:

public abstract class Person {

    private Mediator houseMediator;

    public abstract void action();

    public Mediator getHouseMediator() {
        return houseMediator;
    }

    public void setHouseMediator(Mediator houseMediator) {
        this.houseMediator = houseMediator;
    }
}

房东:

public class HouseOwner extends Person {

    @Override
    public void action() {
        this.getHouseMediator().collectRents(1000);
    }
}

租客:

public class Renter extends Person {

    @Override
    public void action() {
        this.getHouseMediator().repair();
    }
}

物业:

public class Property extends Person {

    @Override
    public void action() {
        this.getHouseMediator().collectPropertyFee(300);
    }
}

客户端调用:

    public static void main(String[] args) {

        Person houseRenter = new HouseOwner();
        Person renter = new Renter();
        Person property = new Property();

        Mediator mediator = new HouseMediator(houseRenter, renter, property);
        houseRenter.setHouseMediator(mediator);
        renter.setHouseMediator(mediator);
        property.setHouseMediator(mediator);

        houseRenter.action();
        renter.action();
        property.action();
    }

3. 总结

仲裁者模式的优点:

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦,减少对象之间的关联性,让每一个对象都能够独立
  • 符合迪米特原则。
  • 不会引入太多其他的系统
  • 系统被依赖的程度降低

仲裁者模式的缺点:

  • 中介者会庞大,变得复杂难以维护。
  • 如果游戏中有大量的功能模块需要中介者,那么担任中介者的角色类将会因为担任大量的中介者角色而容易产生操作接口爆炸的情况。为避免这种情况,我们可以搭配其他设计模式使用。

仲裁者模式的使用场景:

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
  • 机场调度系统。
  • MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
  • 数据库引擎:内部可以分成数个子系统,有专门负责数据库连接地功能与产生数据库操作语句地功能,两个子功能之间地沟通可以通过中介者模式(Mediator)来进行,让两者之间不相互依赖,方便抽换另一个子系统
  • 游戏内各系统的整合
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355