您好,登錄后才能下訂單哦!
文章首發:
行為型模式:中介者模式
十一大行為型模式之二:中介者模式。
姓名 :中介者模式
英文名 :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 次找房,發現個人房源越來越少。每個網站都有個選項:經紀人房源。如下圖:
(圖片截自:安居客網站)
經紀人就扮演著中介的角色,和本文要講的中介者模式完全吻合。我們在找房子的時候,經紀人扮演什么角色呢?我們通過個人房源和經紀人房源的租房案例來簡單描述經紀人的角色。
我們通過個人房源找房子的方式是這樣的:在網上找個人房源的房東,然后挨個聯系,和房東約定好時間去看房,我們跟房東的關系是一對多的關系。小明就在網上看了個人房源,聯系了房東,分別去看了農民房和小區房,用代碼表示如下。
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 中的數據和界面交互工作。看看你工作中的代碼,想想看有沒有哪些對象之間的關系特緊密特混亂,考慮是不是可以通過中介者模式來把依賴關系剝離,讓代碼更清晰。
推薦閱讀:
單一職責原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機上看電子書)
開閉原則(社保這點事)
創建型模式:單例模式(小明就只有 1 輛車)
創建型模式:工廠方法(小明家的車庫)
創建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創建型模式:建造者模式(湯這么煲)
創建型模式:原型模式(復印書籍)
行為型模式:模板方法(運動鞋制造過程)
公眾號后臺回復『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備注『教程』獲取架構師、機器學習等教程
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。