C5) Mediator(中介模式) 定義:定義一個封裝了一系列對象如何相互作用的對象。中介模式通過防止這些對象對彼此明確的涉及來獲得松散的耦合,讓你可以獨(dú)立的改變他們的相互作用。 從定義就能理解這個模式的含義了,這是一個很有趣的模式,不過實(shí)際中運(yùn)用的機(jī)會不太多。假設(shè)一個項(xiàng)目,3個人寫業(yè)務(wù)邏輯,2個人做客戶界面,2個人負(fù)責(zé)測試,那么組長就是一個中介。A完成一個程序P的邏輯部分,通知組長;組長查看對應(yīng)的界面部分,如果B完成了,就通知C進(jìn)行測試;C發(fā)現(xiàn)有bug,通知組長,組長轉(zhuǎn)告A、B進(jìn)行修正。如果B正好休息沒上班,那么組長會安排E來進(jìn)行修正。A、B、C或者更多組員之間無需知道彼此的狀態(tài),甚至不用知道組里面還有誰(做過外包應(yīng)該有些了解的,幾個部門或者公司聯(lián)合開發(fā)時候就是這樣),任何變化都組員都不用知道,只用關(guān)心自己的工作并與組長進(jìn)行溝通,相互協(xié)作的關(guān)系由組長掌握。 常有可能用到這個模式的一般是對界面對象的訪問設(shè)置,比如安裝一個多媒體軟件,有個下拉框,有幾種默認(rèn)設(shè)置:最小安裝、推薦安裝、全部安裝、用戶自定義,對應(yīng)設(shè)置:核心、視頻解碼插件、音頻解碼插件、視頻編碼插件、音頻編碼插件、視頻轉(zhuǎn)換工具、音頻轉(zhuǎn)換工具、皮膚(skin)。那么就這樣一個例子,用代碼來實(shí)現(xiàn)中介模式。 public class setupMode { private Console console = getConsole(); private String modeName; private boolean selected = false; public void select() { setSelected(true); console.selectMode(modeName); } } public class setupItem { private Console console = getConsole(); private String itemName; private boolean checked = false; public void check() { setChecked(true); console.checkItem(itemName); } } public class Console { public void selectMode(String modeName) { setAllModeFalseExcept(modeName); if ("minMode".equals(modeName)) { items.setAllChecked(false); items.get("Core").setChecked(true); items.get("VideoDecode").setChecked(true); items.get("AudioDecode").setChecked(true); }else if ("commonMode".equals(modeName)) { items.setAllChecked(false); items.get("Core").setChecked(true); items.get("VideoDecode").setChecked(true); items.get("AudioDecode").setChecked(true); items.get("VideoTool").setChecked(true); items.get("AudioTool").setChecked(true); }else if ("maxMode".equals(modeName)) { items.setAllChecked(true); }else if ("customMode".equals(modeName)) { //do nothing } } public void checkItem(String itemName) { modes.get("customMode").setSelected(true); selectMode("customMode"); } } 這樣就可以由菜單控制選項(xiàng),同時選項(xiàng)也控制菜單,如果要添加菜單或者選項(xiàng),只需修改Console類,其他類沒有一點(diǎn)影響,如果不是用這種模式,修改的工作量與類的數(shù)量成正比。
|