引言
先回顾一下上一节的桥接模式,我们这节来看看中介者模式。见问识意,就类似中介,在帝都租房,房产中介到处都是,随去可见。
示例地址
类图
image
定义
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象字小尺度的行为上与其他对象的相互作用分开处理。
使用场景
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可采用中介者模式,来解决紧耦合问题。该模式将对象之间的多对多关系变成一对多关系,中介者对象将系统从网状结构变成以调用者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。
中介者模式示例
小明毕业来到帝都,首先肯定有找房子,人生地不熟的,只能依靠中介找房子。像什么我爱我家、链家等等。王大爷,帝都的本地人,各个手上几套房子,都是土豪级别,没事就爱出去旅个游什么的。自己的房子也不管理,直接脱手给中介,图个省事,反正不差钱。这就是很常规的中介者模式。
突然又想到一个例子,农村相亲时,男女双方都不认识,靠的就是中间的媒婆,这也是典型的中介者模式。
1. 先定义一个小明和王大爷公有的类
/**
* 交易的接口
*
* @author 512573717@qq.com
* @created 2018/7/30 下午3:40.
*/
public abstract class Deal {
protected IMediator mMediator;
public Deal(IMediator mediator) {
mMediator = mediator;
}
protected abstract void sendMessage(String message);
protected abstract void receiveMessage(String message);
}
2. 小明(买家,租户)
/**
* 小明想租房子
*
* @author 512573717@qq.com
* @created 2018/7/30 下午5:05.
*/
public class XiaoMing extends Deal {
public XiaoMing(IMediator mediator) {
super(mediator);
}
@Override
protected void sendMessage(String message) {
System.out.println("小明:告诉房产中介" + message);
mMediator.notice(this, message);
}
@Override
protected void receiveMessage(String message) {
System.out.println("小明收到房产中介一条消息:" + message);
}
}
3. 王大爷(出租户,房东)
/**
* 王大爷想出租自己的房子
*
* @author 512573717@qq.com
* @created 2018/7/30 下午5:05.
*/
public class WangDaYe extends Deal {
public WangDaYe(IMediator mediator) {
super(mediator);
}
@Override
protected void sendMessage(String message) {
System.out.println("王大爷:告诉房产中介" + message);
mMediator.notice(this, message);
}
@Override
protected void receiveMessage(String message) {
System.out.println("王大爷收到房产中介一条信息:" + message);
}
}
4. 中介接口
/**
* 中介的接口
*
* @author 512573717@qq.com
* @created 2018/7/30 下午3:42.
*/
public interface IMediator {
void notice(Deal deal, String message);
}
5. 房产中介(链家 我爱我家)
/**
* 房产中介
*
* @author 512573717@qq.com
* @created 2018/7/31 上午10:20.
*/
public class FangChanMediator implements IMediator {
private XiaoMing mXiaoMing;
private WangDaYe mWangDaYe;
public void setBuyer(XiaoMing buyer) {
mXiaoMing = buyer;
}
public void setSeller(WangDaYe seller) {
mWangDaYe = seller;
}
@Override
public void notice(Deal deal, String message) {
System.out.println("中介收到消息 开始匹配");
if (deal == mXiaoMing) {
mWangDaYe.receiveMessage(message);
} else {
mXiaoMing.receiveMessage(message);
}
}
}
6. Client
// 房产中介
FangChanMediator fangChanMediator = new FangChanMediator();
//小明想租房
XiaoMing xiaoMing = new XiaoMing(fangChanMediator);
//王大爷想出租自己的房子
WangDaYe wangDaYe = new WangDaYe(fangChanMediator);
fangChanMediator.setBuyer(xiaoMing);
fangChanMediator.setSeller(wangDaYe);
xiaoMing.sendMessage("我要租一个一室一厅的房子");
System.out.println("======================");
wangDaYe.sendMessage("我要出租我这个一室一厅的房子");
总结
优点
- 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
- 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
- 使用中介者模式可以将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。
缺点
- 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
- 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。