第二十一章 Caché 設計模式 中介者模式
定義
用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變他們之前的交互。
優點
- 中介者模式就是把網狀複雜結構優化爲一對多結構。起到協調作用。
- MVP架構裏面P層其實就是一箇中介者,負責協調V和M。
使用場景
中介者模式很容易在系統中應用,也很容易在系統中誤用,當出現了多對多交互複雜的對象羣時,不要急於使用中介者模式,而要反思你的系統在設計上是不是合理。
中介者模式一般應用於一組對象以定義良好但是複雜的方式進行通信的場合。以及想定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合。
結構圖
描述
安理會做中介,給美國和伊朗傳話。
完整示例
抽象類
Class PHA.YX.Design.Mediator.Country Extends %RegisteredObject
{
Property mediator As UnitedNations;
Method %OnNew(mediator As UnitedNations) As %Status [ Private, ServerOnly = 1 ]
{
s ..mediator = mediator
Quit $$$OK
}
}
具體類
Class PHA.YX.Design.Mediator.USA Extends Country
{
Method %OnNew(mediator As UnitedNations) As %Status [ Private, ServerOnly = 1 ]
{
d ##super(mediator)
Quit $$$OK
}
Method Declare(message As %String)
{
d ..mediator.Declare(message,$this)
}
Method GetMessage(message As %String)
{
w "美國獲得對方信息" _ message,!
}
}
Class PHA.YX.Design.Mediator.Iraq Extends Country
{
Method %OnNew(mediator As UnitedNations) As %Status [ Private, ServerOnly = 1 ]
{
d ##super(mediator)
Quit $$$OK
}
Method Declare(message As %String)
{
d ..mediator.Declare(message,$this)
}
Method GetMessage(message As %String)
{
w "伊拉克獲得對方信息" _ message,!
}
}
抽象中介類
Class PHA.YX.Design.Mediator.UnitedNations Extends %RegisteredObject
{
Method Declare(message As %String, colleague As Country) [ Abstract ]
{
}
}
具體中介類
Class PHA.YX.Design.Mediator.UnitedNationSecurityCouncil Extends UnitedNations
{
Property iraq As Iraq;
Method iraqGet() As Iraq [ ServerOnly = 1 ]
{
Quit i%iraq
}
Method iraqSet(Arg As Iraq) As %Status [ ServerOnly = 1 ]
{
s i%iraq = Arg
Quit $$$OK
}
Property usa As USA;
Method usaGet() As USA [ ServerOnly = 1 ]
{
Quit i%usa
}
Method usaSet(Arg As USA) As %Status [ ServerOnly = 1 ]
{
s i%usa = Arg
Quit $$$OK
}
Method Declare(message As %String, colleague As Country)
{
i colleague = ..usa d
.d ..iraq.GetMessage(message)
e d
.d ..usa.GetMessage(message)
}
}
調用
/// d ##class(PHA.YX.Design.Program).Mediator()
ClassMethod Mediator()
{
s UNSC = ##class(PHA.YX.Design.Mediator.UnitedNationSecurityCouncil).%New()
s usa = ##class(PHA.YX.Design.Mediator.USA).%New(UNSC)
s iraq = ##class(PHA.YX.Design.Mediator.Iraq).%New(UNSC)
d UNSC.iraqSet(iraq)
d UNSC.usaSet(usa)
d usa.Declare("不準研發核而武器,否則要放戰爭!")
d iraq.Declare("我們沒有核武器,也不怕侵略.")
}
DHC-APP>d ##class(PHA.YX.Design.Program).Mediator()
伊拉克獲得對方信息不準研發核武器,否則要放戰爭!
美國獲得對方信息我們沒有核武器,也不怕侵略.
思考
嘗試畫出View,Presenter,Model 三者通過Presenter來通信,View與Model互相不通信。