行为型模式:中介者模式
LieBrother公眾號原文:
行為型模式:中介者模式
十一大行為型模式之二:中介者模式。
簡介
姓名 :中介者模式
英文名 :Mediator Pattern
價(jià)值觀 :讓你體驗(yàn)中介是無所不能的存在
個(gè)人介紹 :
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.
用一個(gè)中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
(來自《設(shè)計(jì)模式之禪》)
你要的故事
看了這小伙子的名字,大家會(huì)很直觀的想到那些拿了我們半個(gè)月租的租房中介同學(xué)。在這不講講房租中介同學(xué),以后可沒機(jī)會(huì)了。大家現(xiàn)在找房子,不管是買還是租,一登錄什么安居客、58同城,是不是有 80% 是經(jīng)紀(jì)人房源,說 80% 還是比較保守的,經(jīng)歷了 4 次找房,發(fā)現(xiàn)個(gè)人房源越來越少。每個(gè)網(wǎng)站都有個(gè)選項(xiàng):經(jīng)紀(jì)人房源。如下圖:
(圖片截自:安居客網(wǎng)站)
經(jīng)紀(jì)人就扮演著中介的角色,和本文要講的中介者模式完全吻合。我們在找房子的時(shí)候,經(jīng)紀(jì)人扮演什么角色呢?我們通過個(gè)人房源和經(jīng)紀(jì)人房源的租房案例來簡單描述經(jīng)紀(jì)人的角色。
個(gè)人房源
我們通過個(gè)人房源找房子的方式是這樣的:在網(wǎng)上找個(gè)人房源的房東,然后挨個(gè)聯(lián)系,和房東約定好時(shí)間去看房,我們跟房東的關(guān)系是一對多的關(guān)系。小明就在網(wǎng)上看了個(gè)人房源,聯(lián)系了房東,分別去看了農(nóng)民房和小區(qū)房,用代碼表示如下。
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 +"想看農(nóng)民房");nongMinFangLandlord2.supply();System.out.println(this.name + "想看小區(qū)房");xiaoQuFangLandlord2.supply();}}/*** 房東*/ abstract class Landlord {// 提供房子public abstract void supply(); }class XiaoQuFangLandlord extends Landlord {@Overridepublic void supply() {System.out.println("小區(qū)房的房東提供一間小區(qū)房");} }class NongMinFangLandlord extends Landlord {@Overridepublic void supply() {System.out.println("農(nóng)民房的房東提供一間小區(qū)房");} }打印結(jié)果如下: 小明想看農(nóng)民房 農(nóng)民房的房東提供一間小區(qū)房 小明想看小區(qū)房 小區(qū)房的房東提供一間小區(qū)房小明分別聯(lián)系小區(qū)房的房東和農(nóng)民房的房東,然后依次去看了農(nóng)民房和小區(qū)房。這樣子有個(gè)弊端就是小明和房東是強(qiáng)關(guān)聯(lián)的關(guān)系,其實(shí)小明只是去看一下房,看完不想租就和房東沒啥關(guān)系了。這個(gè)時(shí)候經(jīng)紀(jì)人就派上用場了,經(jīng)紀(jì)人的主要任務(wù)就是把房子租出去,所以他和房東應(yīng)該是強(qiáng)關(guān)系,直到把房子成功租出去了,才和房東脫離關(guān)系,而小明也不用去挨個(gè)找房東看房子了,這個(gè)職責(zé)轉(zhuǎn)給經(jīng)紀(jì)人,小明只需要聯(lián)系一個(gè)人,那就是經(jīng)紀(jì)人,跟他說我要看小區(qū)房和農(nóng)民房,經(jīng)紀(jì)人就帶他去看。下面就介紹經(jīng)紀(jì)人房源的方式,也就是本文要講的中介者模式。
經(jīng)紀(jì)人房源
用經(jīng)紀(jì)人房源找房子,小明就省心很多了,小明就只聯(lián)系了一個(gè)經(jīng)紀(jì)人,跟他描述了自己要的房源:小區(qū)房和農(nóng)民房都可以,經(jīng)紀(jì)人里面和他約定了一個(gè)下午的時(shí)間,把小明所有想看的房讓他看完,最終小明決定租了一間房。看代碼。
public class MediatorTest {public static void main(String[] args) {System.out.println("小明想要看小區(qū)房和農(nóng)民房");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();}@Overridepublic void supplyHouse(List<String> types) {System.out.println("經(jīng)紀(jì)人提供了如下房源");if (types.contains("XiaoQuFang")) {xiaoQuFangLandlord.supply();}if (types.contains("NongMinFang")) {nongMinFangLandlord.supply();}} }打印結(jié)果: 小明想要看小區(qū)房和農(nóng)民房 經(jīng)紀(jì)人提供了如下房源 小區(qū)房的房東提供一間小區(qū)房 農(nóng)民房的房東提供一間小區(qū)房在代碼中,我們可以看到小明和經(jīng)紀(jì)人是一對一關(guān)系,經(jīng)紀(jì)人和房東是一對多關(guān)系。小明找房經(jīng)歷也輕松多了,只花了一下午就把房子都看了并看中了。這也是中介者模式的優(yōu)點(diǎn),減少了不必要的依賴,降低了類間的耦合。
代碼:
Mediator Pattern
總結(jié)
中介者模式通過在互相依賴的對象中間加了一層,讓原本強(qiáng)依賴的對象變成弱依賴。在軟件編程中,有一個(gè)中介者模式的典型的例子,就是 MVC 框架,也稱三層架構(gòu),通過 Controller (控制層) 將 Model (業(yè)務(wù)邏輯層) 和 View (視圖層) 的依賴給分離開,協(xié)調(diào) Model 和 View 中的數(shù)據(jù)和界面交互工作。看看你工作中的代碼,想想看有沒有哪些對象之間的關(guān)系特緊密特混亂,考慮是不是可以通過中介者模式來把依賴關(guān)系剝離,讓代碼更清晰。
參考資料:《大話設(shè)計(jì)模式》、《設(shè)計(jì)模式之禪》
推薦閱讀:
行為型模式:模板方法
公眾號之設(shè)計(jì)模式系列文章
希望文章對您有所幫助,設(shè)計(jì)模式系列會(huì)持續(xù)更新,感興趣的同學(xué)可以關(guān)注公眾號:LieBrother,第一時(shí)間獲取文章推送閱讀,也可以一起交流,交個(gè)朋友。
總結(jié)
以上是生活随笔為你收集整理的行为型模式:中介者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赵童鞋带你入门PHP(六) ThinkP
- 下一篇: libgit2 0.28.1 发布,纯