中介者模式,定義了乙個中介物件來封裝一系列物件之間的互動關係,中介者使各個物件之間不需要顯式地相互引用,從而降低耦合性。在開發中我們會遇到各個物件相互引用的情況,每個物件都可以和多個物件進行互動,這時將會形成複雜的一對多結構的網狀結構,各個物件之間過度耦合,這樣不利於類的復用和擴充套件。如果引入了中介者模式,各個物件都通過中介者進行互動,那麼物件之間的關係將變成一對一的星型結構。
我們採用園友learninghard玩牌的例子來理解中介者模式的用法。在現實生活中,兩個人打牌,如果某個人贏了會影響到對方的狀態。標準中介者模式有抽象中介者角色,具體中介者角色、抽象同事類和具體同事類四個角色,其中打牌的人都是具體的同事類的物件,算賬的平台是中介者物件。如果此時不採用中介者模式實現的話,則**實現打牌的場景如下所示:
//執行結果如下:抽象玩家類
public
abstract
class
abstractcardplayer
public
abstractcardplayer()
public
abstract
void changecount(int
count, abstractcardplayer other);
}//玩家a類
public
class
playera : abstractcardplayer
}//玩家b類
public
class
playerb : abstractcardplayer
}class
program
;abstractcardplayer b = new playerb() ;
//玩家a贏了玩家b 5元
console.writeline("
a贏了b5元");
a.changecount(
5, b);
console.writeline($
"玩家a現在有元");
console.writeline($
"玩家b現在有元");
//玩家b贏了玩家a 10元
console.writeline("
b贏了a10元");
b.changecount(
10, a);
console.writeline($
"玩家a現在有元");
console.writeline($
"玩家b現在有元");
console.readkey();}}
上邊的**滿足了玩牌的功能,但是有一些缺陷:我們看到上邊栗子中算錢的功能是交給贏家的a.changecount(count, b)方法來實現的,這時是贏家找輸家要錢 贏家a和輸家b是直接通訊的。當玩家比較多的時候,例如a贏了,bcde四個玩家都會輸5元,那麼a就要和bcde玩家都要通訊(多玩家方法改成:a.changecount(count,b,c,d,e)),如b贏了同理,各個玩家組成了乙個複雜的通訊網路,就像上邊的網狀圖,各個玩家過度耦合。如果我們引入乙個中間人來負責統一結算,贏家就可以直接找中間人結算,不必直接找所有的輸家要賬了,**如下:
//執行結果和不用中介者的例子一致。我們可以看到中介者模式降低了各個同事物件的耦合,同事類之間不用直接通訊,直接找中介者就行了,但是中介者模式並沒有降低業務的複雜度,中介者將同事類間的複雜互動邏輯從業務**中轉移到了中介者類的內部。標準中介者模式有抽象中介者角色,具體中介者角色、抽象同事類和具體同事類四個角色,在實際開發中有時候沒必要對具體中介者角色和具體使用者角色進行抽象(如聯合國作為乙個中介者,負責調停各個國家糾紛,但是沒必要把單獨的聯合國抽象成乙個抽象中介者類;上邊例子的抽象玩家類和抽象中介者類都是沒必要的),我們可以根據具體的情況來來選擇是否使用抽象中介者和抽象使用者角色。抽象玩家類
public
abstract
class
abstractcardplayer
public
abstractcardplayer()
public
abstract
void changecount(int
count, abstractmediator mediator);
}//玩家a類
public
class
playera : abstractcardplayer
}//玩家b類
public
class
playerb : abstractcardplayer
}//抽象中介者
public
abstract
class
abstractmediator
public
abstract
void awin(int
count);
public
abstract
void bwin(int
count);
}//具體中介者
public
class
mediator : abstractmediator
public
override
void awin(int
count)
public
override
void bwin(int
count)
}class
program
;abstractcardplayer b = new playerb() ;
abstractmediator mediator = new
mediator(a, b);
//玩家a贏了玩家b 5元
console.writeline("
a贏了b5元");
a.changecount(
5, mediator);
console.writeline($
"玩家a現在有元");
console.writeline($
"玩家b現在有元");
//玩家b贏了玩家a 10元
console.writeline("
b贏了a10元");
b.changecount(
10, mediator);
console.writeline($
"玩家a現在有元");
console.writeline($
"玩家b現在有元");
console.readkey();}}
1.上邊例子的類圖
中介者模式優點:
1 降低了同事類互動的複雜度,將一對多轉化成了一對一;
2 各個類之間的解耦;
3 符合迪公尺特原則。
中介者模式缺點:
1 業務複雜時中介者類會變得複雜難以維護。
參考文獻
[1]
[2]
設計模式(16) 中介者模式(簡單入門 行為模式)
from now on,let us begin design patterns。中介者模式 你為什麼需要中介者模式 通用類圖 角色解說 抽象中介者 定義好同事類物件到中介者物件的介面,用於各個同事類之間的通訊。一般包括乙個或幾個抽象的事件方法,並由子類去實現。中介者實現類 從抽象中介者繼承而來,實...
設計模式 21 中介者模式
中介者模式 用乙個中介物件來封裝一系列的物件互動 中介者 就像我們在租房子一樣,有租房子的中介 抽象中介者 mediator package com.actionpattern.intermediary.edition1 抽象中介者 mediator public abstract class me...
設計模式17 中介者模式
中介者模式 mediator pattern 是用來降低多個物件和類之間的通訊複雜性。這種模式提供了乙個中介類,該類通常處理不同類之間的通訊,並支援松耦合,使 易於維護。中介者模式屬於行為型模式。不應當在職責混亂的時候使用。建立中介類 聊天室,負責傳送通訊 include include inclu...