又到了周五了,日子過得好快,年齡又大了,又是一年光棍節;我的愛情在那里呢?剩下的只有美好的回憶,感覺內心麻木了找不回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();
}
}
仔細觀測你會發現我們的客戶與房東之間的交互都是通過中介者來完成的;但是我們必須正確運用,當我們發現具體業務關聯很多我們很難理清關系時就應該考慮使用中介作為媒介;前面我們也說了 MVP架構模式或者MVC架構都可以看作是中介者模式的運用;
總結一下:
缺點:
中介者模式的缺點就是中介者會膨脹得很大,而且邏輯復雜,原本N個對象直接的相互
依賴關系轉換為中介者和同事類的依賴關系,同事類越多,中介者的邏輯就越復雜;所以說我們一般情況下Android開發中一個activity對應一個中介presenter;除非有通用功能可以抽取到一個presenter中供其它界面使用;
優點:
中介者模式的優點就是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,
同事類只依賴中介者,減少了依賴,當然同時也降低了類間的耦合
好了我們又搞清楚了一個設計模式;功力是不是又深厚了一層呢?其實學習和運用是兩碼事;在實踐中應該多思考怎么寫最好什么模式最好,達到運用自如信手拈來的時候,就可以吹牛逼了。下面是我重新做的一個比較完善的UML圖: