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