如何理解中介者模式
如何理解一個設計模式,首先需要了解他的應用場景,進而得出他的使用價值以及使用原因。我們從最容易理解的日常事務中舉箇中介者模式的栗子,對比加思考來理解中介者模式,包括何爲中介者,爲何需要中介者。
舉個栗子看模式
eg: 舉個栗子,我們搬家的時候,東西很多,不是提着個袋子就能把東西都裝下,於是我們需要找車子。那麼我們怎麼辦呢。以前搬家的時候,會去一些小區門口,一些路口找一些車,看看人家車子大小能不能裝下自己的東西,還得問問人家是不是願意幫忙,搬家甚是麻煩。之後貨拉拉看到了這個商機,貨拉拉負責去找這些願意幫人搬家的車和司機,還統計車子大小,司機的服務質量等信息,於是,有人需要搬家的時候直接找貨拉拉就可以,告訴貨拉拉你需要多大的車,什麼時間需要就可以了,貨拉拉負責幫你聯繫司機和車,兩全其美,豈不美哉。
通過這個例子可以看出,貨拉拉(中介者)是搬家者和搬家車司機之間的一個紐帶,他負責搬家者和搬家車司機之間的通信,而因爲有了貨拉拉這個中介者,搬家者和搬家車司機都可以輕鬆的達到自己的目的。這就是一箇中介者的例子。
那麼我們思考一下,作爲一箇中介者需要有什麼資質和能力呢?
首先貨拉拉(中介者)作爲一個通信聯絡者,他需要知道搬家者和搬家車司機的聯繫方式,其次他需要幫搬家者做一些事情,比如搬家者之前需要找大小合適的車子,現在有了貨拉拉後,貨拉拉需要負責把車子大小告訴搬家者,然後幫搬家者實現搬家的需求。同時因爲有了貨拉拉,我們的搬家者需要聯繫貨拉拉幫我們啊,司機需要貨拉拉能找到自己,但同時自己也可以找到貨拉拉,比如司機想拉貨,但現在沒活,他也可以主動告訴貨拉拉自己的需求,同時我們搬家者也需要知道貨拉拉的存在。
角色組成
綜合考慮,我們可以將中介者模式的組成分爲以下幾個部分:
- 中介者(貨拉拉)
- 需要中介者進行通信聯繫的多方實體(搬家者和搬家車司機)
成分分析
中介需要聯繫多方實體,他需要知道每個實體才能聯繫,所以,他的設計需要包含每個實體的實例作爲其屬性,他需要辦實體做一些事,所以他需要有執行任務的方法。
而我們的多方實體也需要包含有中介者的實例,才能找到中介者,所以中介者需要作爲多方實體的一個屬性,同時定義自己需要做的事,讓中介者代替我們完成。
如何設計中介者模式
知道了實體和中介者的成分後,我們接下來思考中介者模式的設計:
首先定義一個抽象中介者,因爲按照不同功能可劃分爲不同中介(這句話的可以這麼理解,貨拉拉中介要做很多事,於是他按照功能區分了一下,比如負責找車的中介、負責統計車大小的中介等等)。
public abstract class AbstractMediator {
protected BanJiaEntity banjia;//搬家者
protected CarEntity car;//車
//構造函數
public AbstractMediator(){
banjia = new BanJiaEntity(this);
car = new CarEntity(this);
}
//中介者最重要的方法叫做事件方法,處理多個對象之間的關係
public abstract void execute(String str,Object...objects);
}
有了抽象中介後我們讓貨拉拉(中介者實例)繼承抽象中介
public class Mediator extends AbstractMediator {
//中介者最重要的方法
public void execute(String str,Object...objects){
//搬傢俱體操作
if ("banjia".equals(str)) {
doBanjia(objects);
}
//司機求派單
if ("sijiNeedOrder".equals(str)) {
doGiveOrder(objects);
}
}
private void doBanjia(Object...objects) {
banjia.isOk();
car.isOk();
//找車,聯繫,約時間...
}
private void doGiveOrder(Object...objects) {
//找搬家人, 約時間...
banjia.isOk();
car.isOk();
}
}
接下來需要定義實體了,我們有多個實體,他們都需要有中介者作爲屬性,那先抽象一下
public abstract class AbstractEntity {
protected AbstractMediator mediator;
public AbstractEntity(AbstractMediator mediator){
this.mediator = mediator;
}
}
搬家者和搬家車司機作爲具體實體
public BanJiaEntity extends AbstractEntity {
public BanJiaEntity(AbstractMediator mediator){
super(mediator);
}
public void banjia(String str,Object...objects) {
super.mediator.execute(str, objects)
}
public void isOk(){}
}
public CarEntity extends AbstractEntity {
public CarEntity(AbstractMediator mediator){
super(mediator);
}
public void needOrder(String str,Object...objects) {
super.mediator.execute(str, objects)
}
public void isOk(){}
}
這樣,就實現了一箇中介者模式。