我的GitHub | 我的博客 | 我的微信 | 我的郵箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
中介者模式
簡介
用一個中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使耦合松散,而且可以獨立地改變它們之間的交互。
中介者模式也稱為調解者模式或者調停者模式。
當程序存在大量的類時,多個對象之間存在着依賴的關系,呈現出網狀結構
,那么程序的可讀性和可維護性就變差了,並且修改一個類需要牽涉到其他類,不符合開閉原則。
因此我們可以引入中介者,將網狀結構轉化成星型結構
,可以降低程序的復雜性,並且可以減少各個對象之間的耦合。
角色說明:
- 抽象中介者Mediator:定義用於各個同事類之間通信的接口
- 具體中介者ConcreteMediator:實現抽象中介者中定義的方法,它需要了解並維護每個同事對象,並負責協調各個同事對象的交互關系
- 抽象同事類Colleague:同事對象只知道中介者而不知道其他同事對象,同事類之間必須通過中介者才能進行消息傳遞
- 具體同事類ConcreteColleague:每個具體同事類都知道自己本身的行為,其他的行為只能通過中介者去進行
中介者模式的優點
- 適當地使用中介者模式可以
避免同事類之間的過度耦合
,使得各同事類之間可以相對獨立地使用 - 降低了系統對象之間的耦合性,使得對象易於獨立的被復用
- 提高系統的靈活性,使得系統易於擴展和維護
- 使用中介者模式可以將對象間一對多的關聯轉變為一對一的關聯,使對象間的關系易於理解和維護
- 使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用
適用場景
- 在面向對象編程中,一個類必然會與其他的類發生依賴關系,完全獨立的類是沒有意義的。一個類同時依賴多個類的情況也相當普遍,既然存在這樣的情況,說明,一對多的依賴關系有它的合理性,適當的使用中介者模式可以使原本凌亂的對象關系清晰。
- 一般來說,只有對於那種同事類之間是網狀結構的關系,才會考慮使用中介者模式。
- 使用中介者模式,可以將網狀結構變為星狀結構(星狀結構的中心當然是中介者啦),使同事類之間的關系變的清晰一些。
中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。
優點
- 降低類的關系復雜度,將多對多轉化成一對多,實現解耦。
- 符合迪米特原則,依賴的類最少。
缺點
- 同事類越多,中介者的邏輯就越復雜,會變得越難維護。
- 如果本來類的依賴關系不復雜,但是使用了中介者會使原來不復雜的邏輯變得復雜。
通過使用一個中間對象來進行消息分發以及減少類之間的直接依賴。
演示
說到中介者,肯定就想到了房屋中介,下面以房屋中介為例,房東通過中介發布出售信息,中介就會把房屋信息傳遞給有這需求的購房者,購房者再通過中介去看房買房等等。
同事
抽象同事角色
無論是房東還是購房者,他們都能夠發布信息和接受信息
public abstract class Person {//人物類
protected HouseMediator houseMediator;
public Person(HouseMediator houseMediator) {
this.houseMediator = houseMediator;//獲取中介
}
public abstract void send(String message);//發布信息
public abstract void getNotice(String message);//接受信息
}
具體同事角色
下面分別創建一個房東類和一個買房者類
public class Purchaser extends Person {
public Purchaser(HouseMediator houseMediator) {
super(houseMediator);
}
@Override
public void send(String message) {
System.out.println("買房者發布信息:" + message);
houseMediator.notice(this, message);
}
@Override
public void getNotice(String message) {
System.out.println("買房者收到消息:" + message);
}
}
public class Landlord extends Person {
public Landlord(HouseMediator houseMediator) {
super(houseMediator);
}
@Override
public void send(String message) {
System.out.println("房東發布信息:" + message);
houseMediator.notice(this, message);
}
@Override
public void getNotice(String message) {
System.out.println("房東收到消息:" + message);
}
}
中介者
抽象中介者角色
這里就是房屋中介,定義一個通知的方法:
public interface HouseMediator {//房屋中介類
void notice(Person person, String msg);//通知方法
}
具體中介者角色
具體的房屋中介,以鏈家為例,他們能從房東和買房者獲得信息,然后做出不同的行為:
public class Lianjia implements HouseMediator {
Purchaser mPurchaser; //買房者類
Landlord mLandlord; //房東
public void setPurchaser(Purchaser purchaser) {//設置買房者
mPurchaser = purchaser;
}
public void setLandlord(Landlord landlord) {//設置房東
mLandlord = landlord;
}
@Override
public void notice(Person person, String message) {//發送通知
System.out.println("中介收到信息,並轉發給相應的目標人群");
if (person == mPurchaser) {
mLandlord.getNotice(message);
} else if (person == mLandlord) {
mPurchaser.getNotice(message);
}
}
}
客戶端測試
public void test() {
Lianjia houseMediator = new Lianjia();
Purchaser purchaser = new Purchaser(houseMediator);
Landlord landlord = new Landlord(houseMediator);
houseMediator.setLandlord(landlord);
houseMediator.setPurchaser(purchaser);
landlord.send("出售一套別墅");
purchaser.send("求購一套學區房");
}
2016-03-20