LieBrother公衆號原文:
行爲型模式:中介者模式java
十一大行爲型模式之二:中介者模式。git
姓名 :中介者模式github
英文名 :Mediator Pattern編程
價值觀 :讓你體驗中介是無所不能的存在設計模式
我的介紹 :架構
Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.
用一箇中介對象封裝一系列的對象交互,中介者使各對象不須要顯示地相互做用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。
(來自《設計模式之禪》)框架
看了這小夥子的名字,你們會很直觀的想到那些拿了咱們半個月租的租房中介同窗。在這不講講房租中介同窗,之後可沒機會了。你們如今找房子,無論是買仍是租,一登陸什麼安居客、58同城,是否是有 80% 是經紀人房源,說 80% 仍是比較保守的,經歷了 4 次找房,發現我的房源愈來愈少。每一個網站都有個選項:經紀人房源。以下圖:ide
(圖片截自:安居客網站)網站
經紀人就扮演着中介的角色,和本文要講的中介者模式徹底吻合。咱們在找房子的時候,經紀人扮演什麼角色呢?咱們經過我的房源和經紀人房源的租房案例來簡單描述經紀人的角色。this
咱們經過我的房源找房子的方式是這樣的:在網上找我的房源的房東,而後挨個聯繫,和房東約定好時間去看房,咱們跟房東的關係是一對多的關係。小明就在網上看了我的房源,聯繫了房東,分別去看了農民房和小區房,用代碼表示以下。
public class PersonalTest { public static void main(String[] args) { Tenant xiaoMing = new Tenant("小明"); xiaoMing.lookAtHouse(); } } class Tenant { private String name; private XiaoQuFangLandlord xiaoQuFangLandlord2 = new XiaoQuFangLandlord(); private NongMinFangLandlord nongMinFangLandlord2 = new NongMinFangLandlord(); public Tenant(String name) { this.name = name; } public void lookAtHouse() { System.out.println(this.name +"想看農民房"); nongMinFangLandlord2.supply(); System.out.println(this.name + "想看小區房"); xiaoQuFangLandlord2.supply(); } } /** * 房東 */ abstract class Landlord { // 提供房子 public abstract void supply(); } class XiaoQuFangLandlord extends Landlord { @Override public void supply() { System.out.println("小區房的房東提供一間小區房"); } } class NongMinFangLandlord extends Landlord { @Override public void supply() { System.out.println("農民房的房東提供一間小區房"); } } 打印結果以下: 小明想看農民房 農民房的房東提供一間小區房 小明想看小區房 小區房的房東提供一間小區房
小明分別聯繫小區房的房東和農民房的房東,而後依次去看了農民房和小區房。這樣子有個弊端就是小明和房東是強關聯的關係,其實小明只是去看一下房,看完不想租就和房東沒啥關係了。這個時候經紀人就派上用場了,經紀人的主要任務就是把房子租出去,因此他和房東應該是強關係,直到把房子成功租出去了,才和房東脫離關係,而小明也不用去挨個找房東看房子了,這個職責轉給經紀人,小明只須要聯繫一我的,那就是經紀人,跟他說我要看小區房和農民房,經紀人就帶他去看。下面就介紹經紀人房源的方式,也就是本文要講的中介者模式。
用經紀人房源找房子,小明就省心不少了,小明就只聯繫了一個經紀人,跟他描述了本身要的房源:小區房和農民房均可以,經紀人裏面和他約定了一個下午的時間,把小明全部想看的房讓他看完,最終小明決定租了一間房。看代碼。
public class MediatorTest { public static void main(String[] args) { System.out.println("小明想要看小區房和農民房"); Tenant2 xiaoMing = new Tenant2("小明", Arrays.asList("XiaoQuFang", "NongMinFang")); xiaoMing.lookAtHouse(); } } /** * 租客 */ class Tenant2 { private String name; private List<String> wantTypes; private RentingMediator rentingMediator = new RentingMediator(); public Tenant2(String name, List<String> wantTypes) { this.name = name; this.wantTypes = wantTypes; } public void lookAtHouse() { rentingMediator.supplyHouse(wantTypes); } } /** * 中介抽象類 */ abstract class Mediator { // 看房 public abstract void supplyHouse(List<String> types); } /** * 租房中介 */ class RentingMediator extends Mediator { private XiaoQuFangLandlord xiaoQuFangLandlord; private NongMinFangLandlord nongMinFangLandlord; public RentingMediator() { xiaoQuFangLandlord = new XiaoQuFangLandlord(); nongMinFangLandlord = new NongMinFangLandlord(); } @Override public void supplyHouse(List<String> types) { System.out.println("經紀人提供了以下房源"); if (types.contains("XiaoQuFang")) { xiaoQuFangLandlord.supply(); } if (types.contains("NongMinFang")) { nongMinFangLandlord.supply(); } } } 打印結果: 小明想要看小區房和農民房 經紀人提供了以下房源 小區房的房東提供一間小區房 農民房的房東提供一間小區房
在代碼中,咱們能夠看到小明和經紀人是一對一關係,經紀人和房東是一對多關係。小明找房經歷也輕鬆多了,只花了一下午就把房子都看了並看中了。這也是中介者模式的優勢,減小了沒必要要的依賴,下降了類間的耦合。
代碼:
Mediator Pattern
中介者模式經過在互相依賴的對象中間加了一層,讓本來強依賴的對象變成弱依賴。在軟件編程中,有一箇中介者模式的典型的例子,就是 MVC 框架,也稱三層架構,經過 Controller (控制層) 將 Model (業務邏輯層) 和 View (視圖層) 的依賴給分離開,協調 Model 和 View 中的數據和界面交互工做。看看你工做中的代碼,想一想看有沒有哪些對象之間的關係特緊密特混亂,考慮是否是能夠經過中介者模式來把依賴關係剝離,讓代碼更清晰。
參考資料:《大話設計模式》、《設計模式之禪》
推薦閱讀:
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號:LieBrother,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。