壽光網(wǎng)站開發(fā)種子搜索引擎torrentkitty
文章目錄
- 概念
- 結(jié)構(gòu)
- 實(shí)例
- 總結(jié)
概念
中介者模式:用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
就好比世界各個(gè)國家之間可能會(huì)產(chǎn)生沖突,但是當(dāng)產(chǎn)生沖突的時(shí)候需要聯(lián)合國來解決沖突。每個(gè)國家之間的關(guān)系,就好比對(duì)象和對(duì)象之間的關(guān)系,這就需要每個(gè)對(duì)象知道其他的所有對(duì)象,具有很強(qiáng)的耦合性。但是每個(gè)國家只需要關(guān)聯(lián)聯(lián)合國這個(gè)對(duì)象的話,耦合性就會(huì)降低很多。
結(jié)構(gòu)
Mediator(抽象中介者):它定義一個(gè)接口,該接口用于與各同事對(duì)象之間進(jìn)行通信。
ConcreteMediator(具體中介者):抽象中介者的子類,協(xié)調(diào)各個(gè)同事對(duì)象來實(shí)現(xiàn)寫作關(guān)系,它維持了對(duì)各個(gè)不同同事對(duì)象的引用。
Colleague(抽象同事類):它定義公有的方法,它維持了一個(gè)對(duì)抽象中介者類的引用。
ConcreteColleague(具體同事類):它是抽象同事類的子類,每一個(gè)同事之間需要通信時(shí)需要先與中介者通信,通過中介者再實(shí)現(xiàn)其他同事之間的通信。
實(shí)例
現(xiàn)在以美國和伊拉克之間的戰(zhàn)爭(zhēng)為例,聯(lián)合國作為中介者,用中介者模式來實(shí)現(xiàn)這個(gè)demo。
聯(lián)合國機(jī)構(gòu)類
public abstract class UnitedNations {public abstract void declare(String message, Country colleague);
}
聯(lián)合國安全理事會(huì)
@Data
public class UnitedNationsSecurityCouncil extends UnitedNations {private USA usa;private Iraq iraq;@Overridepublic void declare(String message, Country colleague) {if (colleague == usa) {iraq.getMessage(message);} else {usa.getMessage(message);}}
}
國家類
public abstract class Country {protected UnitedNations mediator;protected Country(UnitedNations mediator) {this.mediator = mediator;}public abstract void declare(String message);public abstract void getMessage(String message);}
美國類
public class USA extends Country {public USA(UnitedNations mediator) {super(mediator);}@Overridepublic void declare(String message) {super.mediator.declare(message, this);}@Overridepublic void getMessage(String message) {System.out.println("美國獲得對(duì)方信息:" + message);}
}
伊拉克類
public class Iraq extends Country {public Iraq(UnitedNations mediator) {super(mediator);}@Overridepublic void declare(String message) {super.mediator.declare(message, this);}@Overridepublic void getMessage(String message) {System.out.println("伊拉克獲得對(duì)方信息:" + message);}
}
客戶端
public class Client {public static void main(String[] args) {UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil();USA c1 = new USA(unsc);Iraq c2 = new Iraq(unsc);unsc.setUsa(c1);unsc.setIraq(c2);c1.declare("不準(zhǔn)研制核武器,否則要發(fā)動(dòng)戰(zhàn)爭(zhēng)!");c2.declare("我們沒有核武器,也不怕侵略。");}
}
打印結(jié)果:
總結(jié)
中介者模式將一個(gè)網(wǎng)狀的系統(tǒng)結(jié)構(gòu)變成了一個(gè)以中介者對(duì)象為中心的星型結(jié)構(gòu),也是一個(gè)“迪米特法則”應(yīng)用的標(biāo)準(zhǔn)模式,各個(gè)對(duì)象之間不需要耦合,它們之間的溝通僅需要中介者即可。但因?yàn)橹薪檎弑旧硇枰P(guān)聯(lián)大量的對(duì)象,導(dǎo)致后續(xù)的維護(hù)比較困難。因此也可以做一個(gè)小個(gè)改善,將變的地方放到配置中進(jìn)行維護(hù)。
public class UnitedNationsSecurityCouncil extends UnitedNations {//放到配置中心private List<Country> countryList = new ArrayList<>();@PostConstructpublic void init() {countryList=Congfiguration.getCountryList();}@Overridepublic void declare(String message, Country colleague) {countryList.forEach(country -> {if (country.getClass() == colleague.getClass()) {country.getMessage(message);}});}
}