有一個手機倉儲管理系統,使用者有三方:銷售、倉庫管理者、采購。需求是:銷售一旦達成訂單,銷售人員會通過系統的銷售子系統部分通知倉儲子系統,倉儲子系統會将可出倉手機數量減少,同時通知采購管理子系統目前銷售訂單;倉儲子系統的庫存到達門檻值以下,會通知銷售子系統和采購子系統,并督促采購子系統采購;采購完成後,采購人員會把采購資訊填入采購子系統,采購子系統會通知銷售子系統采購完成,并通知倉庫子系統增加庫存。
從需求描述來看,每個子系統都和其它子系統有所交流,在設計系統時,如果直接在一個子系統中內建對另兩個子系統的操作,一是耦合太大,二是不易擴充。為解決這類問題,我們需要引入一個新的角色-中介者-來将“網狀結構”精簡為“星形結構”。(為充分說明設計模式,某些系統細節暫時不考慮,例如:倉庫滿了怎麼辦該怎麼設計。類似業務性的内容暫時不考慮)
首先構造三個子系統,即三個類(在中介者模式中,這些類叫做同僚些):
當各個類在初始時都會指定一個中介者,而各個類在有變動時,也會通知中介者,由中介者協調各個類的操作。
中介者實作如下:
中介者模式中的execute是最重要的方法,它根據同僚類傳遞的資訊,直接協調各個同僚的工作。
在場景類中,設定倉儲門檻值為200,先采購300,再賣出120,實作如下:
列印結果如下:
purchase:bought 300
mediator:get info--buy
warehouse:increase 300
mediator:get info--increase
sales:get notice--inc 300
purchase:get notice--inc 300
sales:get notice--bought 300
sales:sell 120
mediator:get info--sell
warehouse:decrease 120
mediator:get info--decrease
sales:get notice--dec 120
purchase:get notice--dec 120
warehouse:warning...stock is low...
mediator:get info--warning
sales:get notice--stock is low.180 left.
purchase:get notice--stock is low. please buy more!!! 180 left
purchase:get notice--sold 120
中介者模式的定義為:用一個中介對象封裝一系列的對象互動。中介者使各對象不需要顯式地互相作用,進而使其耦合松散,并可以獨立地改變它們之間的互動。
優點:
1、減少類與類的依賴,降低了類和類之間的耦合;
2、容易擴充規模。
應用場景:
1、設計類圖時,出現了網狀結構時,可以考慮将類圖設計成星型結構,這樣就可以使用中介者模式了。如機場排程系統(多個跑道、飛機、指揮塔之間的排程)、路由系統;著名的mvc架構中,其中的c(controller)就是m(model)和v(view)的中介者。
1、中介者本身的複雜性可能會很大,例如,同僚類的方法如果很多的話,本例中的execute邏輯會很複雜。