前言
中介者模式又叫调解者模式,属于行为类模式,其意义在于封装一系列对象操作,使原本需要相互显式调用的各个对象不再需要直接显式调用,而是通过中间对象来做这个事情;这样就会将原本的网状结构变成了星型结构,各个对象只需要去对这个中间者交互,这样做就变得简单了。
适用场景
当对象之间的交互多而杂,相互依赖彼此,那么自然而然在后续修改中要跟着改所有的依赖,这样代码的扩展性就差了点,中介者模式完全适合,其解决了该场景下的高耦合问题,将整个结构变成以中心类扩展的星型结构。
模式结构
Mediator:定义好同事类(相当于要找中介的客户)对象到中介者对象的接口,用于各个同事类之间的通信,抽象出中介的方法,由子类去实现。
ConcreteMediator:具体终结者,实现中介者方法,影响其他同事类。
Colleague:抽象同事类角色,定义同事类就是对象会影响其他的对象,同时也会被其他对象影响,当然为了扩展最好是先定义一个同事类的基类,为抽象类。
ConcreteColleague:具体同事类角色,继承抽象同事类,但是在实际开发中可以不写接口类;在具体类里书写自己独特的方法。
Demo
简化一个买卖二手房的过程,有卖家和买家,卖家先给个价,买家还个价,如果同意就成交了。我们先声明中介者,按模式结构:
Mediator
package com.demo.mediator;
/**
* Created by italkbb on 2017/12/27.
*/
public abstract class Mediator {
/**
* 中介者在得到具体客户改变时,要起到沟通作用
* @param colleague
*/
public abstract void change(Colleague colleague);
}
中介发现两边有一边变了就通知另一边:
ConcreteMediator
package com.demo.mediator;
/**
* Created by italkbb on 2017/12/27.
*/
public class HouseMediator extends Mediator {
private Sellers mSellers;
private Buyers mBuyers;
/**
*
* @param colleague
*/
@Override
public void change(Colleague colleague) {
if (colleague == mSellers){
mBuyers.setSellersPrice(mSellers.getPrice());
}else if(colleague == mBuyers){
mSellers.setBuyersPrice(mBuyers.getPrice());
}
}
public void setSellers(Sellers mSellers) {
this.mSellers = mSellers;
}
public void setBuyers(Buyers mBuyers) {
this.mBuyers = mBuyers;
}
}
根据上面的代码我们知道还缺买家和卖家,那么我们可以先抽象一个基类:
Colleague
package com.demo.mediator;
/**
* Created by italkbb on 2017/12/27.
*/
public class Colleague {
// 协调者应该被所有人知道
protected Mediator mMediator;
public Colleague(Mediator mediator){
this.mMediator = mediator;
}
}
继承出两个具体同事(卖家和买家):
package com.demo.mediator;
/**
* Created by italkbb on 2017/12/27.
*/
/**
* 卖家
*/
public class Sellers extends Colleague{
private int mPrice;
/**
* 构造方法
* @param mediator
*/
public Sellers(Mediator mediator) {
super(mediator);
}
/**
* 卖家出价价格
* @param mPrice
*/
public void setSellersPrice(int mPrice) {
this.mPrice = mPrice;
mMediator.change(this);
}
/**
* 卖家接受价格
* @param mPrice
*/
public void setBuyersPrice(int mPrice) {
this.mPrice = mPrice;
}
/**
* 获取房价
* @return
*/
public int getPrice() {
return this.mPrice;
}
}
package com.demo.mediator;
/**
* Created by italkbb on 2017/12/27.
*/
/**
* 买家
*/
public class Buyers extends Colleague {
private int mPrice;
/**
* 构造方法
* @param mediator
*/
public Buyers(Mediator mediator) {
super(mediator);
}
/**
* 买家接受价格
* @param mPrice
*/
public void setSellersPrice(int mPrice) {
this.mPrice = mPrice;
}
/**
* 买家出价价格
* @param mPrice
*/
public void setBuyersPrice(int mPrice) {
this.mPrice = mPrice;
mMediator.change(this);
}
/**
* 获取房价
* @return
*/
public int getPrice() {
return this.mPrice;
}
}
模拟一个买卖过程,简单的假象为卖家出一次价,买家觉得贵了点然后还个价,就成交。
package com.demo.mediator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import teltplay.example.com.kotlindemo.R;
public class MediatorActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mediator);
// 卖家和买家都找到了中介
HouseMediator houseMediator = new HouseMediator();
Buyers buyers = new Buyers(houseMediator);
Sellers sellers = new Sellers(houseMediator);
houseMediator.setBuyers(buyers);
houseMediator.setSellers(sellers);
// 卖家出了个理想价
sellers.setSellersPrice(4000000);
// 买家觉得有点贵,想在这个基础上减少10万
buyers.setBuyersPrice(buyers.getPrice() - 100000);
// 最后两边同意,来看最终价格
Toast.makeText(this,"成交价:" + sellers.getPrice(),Toast.LENGTH_LONG).show();
}
}
就这样简单的中介者模式就实现了,在买卖过程中,买家与卖家没有沟通,只用到了中介者协调两边的关系,这样使得程序更加易于扩展。
后记
android中其实很多时候都会有中介者模式,只是类图里的角色并不是都是独立的类,简单的说,比如监听输入框内容从而去改变界面的场景,只要编辑框内容发生变化,change方法会去改变别的组件,最后说一下优缺点,适当地使用中介者模式可以避免对象间的过度依赖,使得各同事类之间可以相对独立地使用,可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护.缺点的话如果在同事类间依赖并不复杂使用该模式会让事情比没有用中介者模式更复杂。