LieBrother公众号原文:行为型模式:中介者模式

又到了周五了,日子过得好快,年龄又大了,又是一年光棍节;我的爱情在那里呢?剩下的只有美好的回忆,感觉内心麻木了找不回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.(用一个中介对象封装一系列的对象
交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它
们之间的交互。)
我们先看下通用的类图:

更多Java设计模式:Java设计模式-目录

图片 1

图片 2

一、定义

十一大行为型模式之二:中介者模式。

图片.png

中介者模式的定义

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.(用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。)

图片 3

中介者模式通用类图

从类图中看,中介者模式由以下几部分组成:

姓名 :中介者模式

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

Mediator抽象中介者角色:

定义统一的接口,用于各同事角色之间的通信。

英文名 :Mediator Pattern

          package com.ldl.mediatortest;

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

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

    }

Concrete Mediator具体中介者角色:

通过协调各同事角色实现协作行为,因此它bi’xu必须依赖于各个同事角色。

价值观 :让你体验中介是无所不能的存在

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

Colleague同事角色:

每个同事角色都知道中介者角色,并且与其他同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的状态,处理自己的行为等,这种行为叫做自发行为(Self-Method),与其他同事类或中介者没有任何的依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法(Dep-Method)。

//通用抽象中介者
public abstract class Mediator { 
    //定义同事类 
    protected ConcreteColleague1 c1; 
    protected ConcreteColleague2 c2; 
    //getter/setter ... 
    //中介者模式的业务逻辑 
    public abstract void doSomething1(); 
    public abstract void doSomething2();
}

//通用中介者
public class ConcreteMediator extends Mediator { 
    @Override 
    public void doSomething1(){ 
        super.c1.selfMethod1(); 
        super.c2.selfMethod2(); 
    } 
    public void doSomething2(){ 
        super.c1.selfMethod1(); 
        super.c2.selfMethod2(); 
    }
}

//抽象同事类
public abstract class Colleague { 
    protected Mediator mediator; 
    public Colleague(Mediator _mediator) { 
        this.mediator = _mediator; 
    }
}

//具体同事类
public class ConcreteColleague1 extends Colleague { 
    //通过构造函数传递中介者  
    public ConcreteColleague1(Mediator _mediator){ 
        super(_mediator); 
    } 
    //自有方法 self-method  
    public void selfMethod1(){ 
        //处理自己的业务逻辑  
    } 
    //依赖方法 dep-method  
    public void depMethod1(){ 
        //处理自己的业务逻辑
        //自己不能处理的业务逻辑,委托给中介者处理  
        super.mediator.doSomething1(); 
    }
}

public class ConcreteColleague2 extends Colleague { 
    //通过构造函数传递中介者  
    public ConcreteColleague2(Mediator _mediator){ 
        super(_mediator); 
    } //自有方法 self-method  public void selfMethod2(){ 
        //处理自己的业务逻辑  
    } 
    //依赖方法 dep-method  
    public void depMethod2(){ 
        //处理自己的业务逻辑  
        //自己不能处理的业务逻辑,委托给中介者处理  
        super.mediator.doSomething2(); 
    }
}

个人介绍

                     /**
         * 
       */
    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押一付一");
}
      }

二、应用

发表评论

电子邮件地址不会被公开。 必填项已用*标注