一句话定义
在多个对象关系交错复杂的情况中,提供中介类进行关系处理,降低类之间的耦合
使用场景
1. 多个类关系复杂、交错
2. 使用中间类进行处理,形成星状结构
实现要点
1. 将所有交互集中到中介者
2. 交互对象不互相依赖
情景假设
张三趁着房价上涨买房,新房限购只能购买暂时不限购的二手房,同时委托中介进行处理,中介就需要处理购房者、卖房者(李四)、贷款银行三者的交互,而三者不互相交互,所有的相关事宜全部交给中介进行处理。
设定:
张三:买房;获得房子
银行:发放贷款;收取房贷
李四:收钱;拿出房产证
实现步骤
1. 首先创建抽象Colleague对象。包括买家、卖家、银行。
package com.example.ffengz.designmode.mediator;
/**
* 抽象买家
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public abstract class Buyer {
// 委托的中介
protected Mediator mMediator;
/**
* 绑定中介者
*/
public Buyer(Mediator mediator) {
this.mMediator = mediator;
}
/**
* 买房
*/
abstract void buyHouse();
/**
* 得到房产证
*/
abstract void getHouse();
}
package com.example.ffengz.designmode.mediator;
/**
* 抽象卖家
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public abstract class Seller {
// 委托的中介
protected Mediator mMediator;
/**
* 绑定中介者
*/
public Seller(Mediator mediator) {
this.mMediator = mediator;
}
/**
* 收钱
*/
abstract void getMoney();
/**
* 付出房产证
*/
abstract void giveHouse();
}
package com.example.ffengz.designmode.mediator;
/**
* 抽象银行
* 这里假设银行与客户也不直接交互,不等同于现实情况
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public abstract class Bank {
// 委托的中介
protected Mediator mMediator;
/**
* 绑定中介者
*/
public Bank(Mediator mediator) {
this.mMediator = mediator;
}
/**
* 贷款
*/
abstract void lending();
/**
* 获取月供
*/
abstract void getMonthlyMoney();
}
2. 创建具体的买家:张三
package com.example.ffengz.designmode.mediator;
import android.util.Log;
/**
* 张三买房者
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public class Z3Buyer extends Buyer{
/**
* 绑定中介者
*
* @param mediator
*/
public Z3Buyer(Mediator mediator) {
super(mediator);
}
@Override
public void buyHouse() {
Log.i("info", "buyHouse: 张三买房");
Log.i("info", "buyHouse: 张三给首付");
mMediator.change(this);
}
@Override
void getHouse() {
Log.i("info", "buyHouse: 张三获得房子");
Log.i("info", "buyHouse: 张三给房贷");
}
}
3. 创建具体的卖家:李四
package com.example.ffengz.designmode.mediator;
import android.util.Log;
/**
* 李四 卖房者
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public class L4Seller extends Seller{
/**
* 绑定中介者
*
* @param mediator
*/
public L4Seller(Mediator mediator) {
super(mediator);
}
@Override
void getMoney() {
Log.i("info", "buyHouse: 李四获得全款");
}
@Override
void giveHouse() {
Log.i("info", "buyHouse: 李四交出房子");
mMediator.change(this);
}
}
4. 创建中介者对象。
package com.example.ffengz.designmode.mediator;
import android.util.Log;
/**
* 抽象中介者
*
* @author fengzhen
* @version 1.0, 2017/3/29
*/
public class Mediator {
private Buyer mBuyer;
private Seller mSeller;
private Bank mBank;
public void setmBuyer(Buyer mBuyer) {
this.mBuyer = mBuyer;
}
public void setmSeller(Seller mSeller) {
this.mSeller = mSeller;
}
public void setmBank(Bank mBank) {
this.mBank = mBank;
}
public void change(Bank bank){
mSeller.getMoney();
mSeller.giveHouse();
}
public void change(Buyer buyer){
mBank.lending();
}
public void change(Seller seller){
mBuyer.getHouse();
mBank.getMonthlyMoney();
}
}
5. 进行购房流程
// 中间者模式
Mediator mediator = new Mediator();
Z3Buyer z3Buyer = new Z3Buyer(mediator);
L4Seller l4Seller = new L4Seller(mediator);
CenterBank centerBank = new CenterBank(mediator);
// 对象设置
mediator.setmBuyer(z3Buyer);
mediator.setmSeller(l4Seller);
mediator.setmBank(centerBank);
// 张三买房
z3Buyer.buyHouse();
6. 结果展示
03-29 17:04:12.405 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三买房
03-29 17:04:12.943 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三给首付
03-29 17:04:19.043 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 银行放贷
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 李四获得全款
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 李四交出房子
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三获得房子
03-29 17:04:19.720 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 张三给房贷
03-29 17:04:19.721 8170-8170/com.example.ffengz.designmode I/info: buyHouse: 得到月供
优缺点
通过例子可以看出,使用终结者模式优缺点。将复杂、高耦合整合到终结者中,每个Colleage对象只用关注自己的流程交互,然后通知中介者状态发生改变,统一通过终结者进行各个流程的续接交互。
将多个对象的网状结构改成星状结构,方便理解,同时降低耦合度。