中介者模式

中介者模式

如何理解中介者模式

复杂的进销存系统类图

类图

  • 虽然不同类型的参与者完成各自的活动,但是每个类相互关联耦合
  • 每个类与多个朋友类相互交互,朋友类越多,耦合性越大,要修改一个,就得修改一大片--- 违反迪米特法则
  • 不同参与者之间交互过于复杂,维护比较困难

使用一个中介者对象,他将各个对象之间的交互封装起来作为一个中间桥梁,降低各个参与者的耦合性。

中介者类图

  • 每个参与者只负责自己的业务逻辑,不属于自己的交给中介者去处理
  • 每个参与者不再交互交流,简化了各模块间的耦合性
  1. 抽象中介者类

定义统一的接口,用于各个参与者角色之间的通信

public abstract class Mediator {

    protected ConcreteColleagueA concreteColleagueA;

    protected ConcreteColleagueB concreteColleagueB;

    public Mediator(){
        concreteColleagueA = new ConcreteColleagueA(this);
        concreteColleagueB = new ConcreteColleagueB(this);
    }

    public abstract void doSomethingA();

    public abstract void doSomethingB();
}
Q:为什么使用参与类实现类注入,而不使用抽象类注入(接口注入)
A:因为每个参与类没有必须要完成的业务方法(没有相同的方法), 假如有相同的方法,当然要注入抽象类做到依赖倒置。

  1. 抽象参与者类

每一个参与者必须知道中介者角色,所以通过构造函数传入

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
}
  1. 具体中介者类

协调各个参与者实现协作工作行为,要依赖各个参与者

public class ConcreteMediator extends Mediator{

    @Override
    public void doSomethingA() {
        super.concreteColleagueA.selfMethod();
        super.concreteColleagueB.selfMethod();
    }

    @Override
    public void doSomethingB() {
        super.concreteColleagueA.selfMethod();
        super.concreteColleagueB.selfMethod();
    }
}
  1. 具体参与者类A
  • 自身的行为selfMethod,用于处理自身的业务逻辑
  • 依赖的行为depMethod,依靠中介者去完成
public class ConcreteColleagueA extends Colleague{
    public ConcreteColleagueA(Mediator mediator){
        super(mediator);
    }

    public void selfMethod(){
        //自己的业务逻辑
    }

    public void depMethod(){
        //不能处理的业务逻辑,交给中介者处理
        super.mediator.doSomethingA();
    }
}
  1. 具体参与者类B
public class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void selfMethod(){
        //自己能够处理的业务逻辑
    }

    public void depMethod(){
        super.mediator.doSomethingB();
    }
}
  1. 客户端
public class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void selfMethod(){
        //自己能够处理的业务逻辑
    }

    public void depMethod(){
        super.mediator.doSomethingB();
    }
}

用一个中介对象封装一系列的对象交互,中介者使对象不需要显示的相互作用,从而使其耦合松散,并且可以独立的改变他们之间的交互

中介者模式有什么优势

  1. 系统更加灵活,各个参与者相互独立
  2. 减少类间的依赖,参与类只依赖中介者,减少了依赖,降低了类间的耦合

中介者模式存在的问题

  1. 中介者承担了太多的职责,一旦出现问题,整个系统都会受影响
  2. 中介者会变得非常复杂,原本参与者间的关系转换成了中介者与参与者的关系,参与者越多,中介者就越复杂

中介者模式要慎用

  1. 量力而行。 中介者模式会使中介者逻辑复杂化。使用不当会把问题变得复杂,如果本身就只有简单的几个依赖关系,就没必要用终结者模式。所以要根据情况权衡中介者模式的使用
  2. 中介者适合多个对象紧密耦合的情况--蜘蛛网结构,中介者模式能将蜘蛛网结构梳理成星型结构

留下的问题

Q:不符合依赖倒置原则,很少使用接口或者抽象类

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

推荐阅读更多精彩内容