java設(shè)計模式之外觀模式學習筆記
外觀模式: 又稱門面模式: 外觀Facade為子系統(tǒng)的一組接口提供一個一致界面,使得這組子系統(tǒng)易于使用(通過引入一個新的外觀角色降低原系統(tǒng)復(fù)雜度,同時降低客戶類與子系統(tǒng)的耦合度).
圖片來源: 設(shè)計模式: 可復(fù)用面向?qū)ο筌浖幕A(chǔ).
實現(xiàn)
案例需求: 租房
有過自己找房租房經(jīng)歷的同學能夠體會得到找房是件很痛苦的事, 不光要挨個小區(qū)跑而且還要跟(二)房東討價還價. 于是后來學聰明了, 不再自己挨門挨戶的磨嘴皮子, 而是直接找像鏈家、我愛我家這樣的房屋中介, 他們手上握有一定的房源, 我們只需付給他們一筆傭金, 他們便可以代我們跟房東講價, 而且他們大都很專業(yè), 省時間又省錢. 此時房屋中介就是一個外觀Facade, 而房屋的出租戶就是子系統(tǒng)SubSystem:
Facade
外觀類: 知道哪些子系統(tǒng)負責處理請求, 將客戶的請求代理給適當?shù)淖酉到y(tǒng)對象:
public class MediumFacade { private CuiYuanApartment cuiyuan; private XiXiApartment xixi; private XiHuApartment xihu; public MediumFacade() { cuiyuan = new CuiYuanApartment("翠苑小區(qū)", 900, 1); xixi = new XiXiApartment("西溪花園", 1200, 1); xihu = new XiHuApartment("西湖小區(qū)", 2600, 1); } public void rentingHouse(double price) { // 價錢合適而且有房可組 if (price >= cuiyuan.getPrice() && cuiyuan.getStatus() != 0) { System.out.println("預(yù)訂" + cuiyuan.getLocation()); cuiyuan.setStatus(0); } else if (price >= xixi.getPrice() && xixi.getStatus() != 0) { System.out.println("預(yù)訂" + xixi.getLocation()); xixi.setStatus(0); } else if (price >= xihu.getPrice() && xihu.getStatus() != 0) { System.out.println("預(yù)訂" + xihu.getLocation()); xihu.setStatus(0); } else { System.out.println("出價太低/沒有房源 ..."); } } }
SubSystem
子系統(tǒng)集合: 實現(xiàn)子系統(tǒng)功能, 處理Facade對象指派的任務(wù)(注意子系統(tǒng)內(nèi)沒有任何Facade信息,即沒有任何Facade對象引用):
/** * @author jifang * @since 16/8/23 上午10:12. */ public class XiHuApartment { private String location; private double price; private int status; public XiHuApartment(String location, double price, int status) { this.location = location; this.price = price; this.status = status; } public String getLocation() { return location; } public double getPrice() { return price; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } } class XiXiApartment { private String location; private double price; private int status; public XiXiApartment(String location, double price, int status) { this.location = location; this.price = price; this.status = status; } public String getLocation() { return location; } public double getPrice() { return price; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } } class CuiYuanApartment { private String location; private double price; private int status; public CuiYuanApartment(String location, double price, int status) { this.location = location; this.price = price; this.status = status; } public String getLocation() { return location; } public double getPrice() { return price; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } }
Client
這樣, Client只需跟一個房屋中介聯(lián)系并給出我們的報價, 他們便會幫我們聯(lián)系所有符合的房東:
public class Client { @Test public void client() { MediumFacade facade = new MediumFacade(); facade.rentingHouse(800); } }
小結(jié)
有過面向?qū)ο箝_發(fā)經(jīng)驗的同學 即使沒有聽說過外觀模式, 也完全有可能使用過他, 因為他完美的體現(xiàn)了依賴倒轉(zhuǎn)原則和迪米特法則的思想, 是非常常用的模式之一.
使用
首先 在設(shè)計初期, 應(yīng)該有意識的進行層次分離, 比如經(jīng)典的三層架構(gòu), 層與層之間建立Facade, 這樣可以為復(fù)雜的子系統(tǒng)提供一個簡單的接口, 使耦合度大大降低.
其次 在開發(fā)階段, 子系統(tǒng)往往因為不斷的重構(gòu)而變得越來越復(fù)雜, 增加Facade可以提供一個簡單的接口, 減少模塊間依賴.
第三 在維護一個遺留系統(tǒng)時, 可能這個系統(tǒng)已經(jīng)非常難以維護和擴展了, 但因為它包含非常重要的功能, 新的需求必須依賴它, 此時可以為新系統(tǒng)開發(fā)一個Facade, 為設(shè)計粗糙或高復(fù)雜度的遺留代碼提供一個的比較清晰簡單的接口, 讓新系統(tǒng)與Facade交互, 而Facade與遺留代碼交互所有繁雜的工作.
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實現(xiàn)方法)
下面小編就為大家?guī)硪黄猨ava 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實現(xiàn)方法)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式
這篇文章主要介紹了SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02JavaMail整合Spring實現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細介紹了JavaMail整合Spring實現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08