java設(shè)計(jì)模式之外觀模式學(xué)習(xí)筆記
外觀模式: 又稱門面模式: 外觀Facade為子系統(tǒng)的一組接口提供一個一致界面,使得這組子系統(tǒng)易于使用(通過引入一個新的外觀角色降低原系統(tǒng)復(fù)雜度,同時降低客戶類與子系統(tǒng)的耦合度).
圖片來源: 設(shè)計(jì)模式: 可復(fù)用面向?qū)ο筌浖幕A(chǔ).
實(shí)現(xiàn)
案例需求: 租房
有過自己找房租房經(jīng)歷的同學(xué)能夠體會得到找房是件很痛苦的事, 不光要挨個小區(qū)跑而且還要跟(二)房東討價還價. 于是后來學(xué)聰明了, 不再自己挨門挨戶的磨嘴皮子, 而是直接找像鏈家、我愛我家這樣的房屋中介, 他們手上握有一定的房源, 我們只需付給他們一筆傭金, 他們便可以代我們跟房東講價, 而且他們大都很專業(yè), 省時間又省錢. 此時房屋中介就是一個外觀Facade, 而房屋的出租戶就是子系統(tǒng)SubSystem:
Facade
外觀類: 知道哪些子系統(tǒng)負(fù)責(zé)處理請求, 將客戶的請求代理給適當(dā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)集合: 實(shí)現(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)系并給出我們的報(bào)價, 他們便會幫我們聯(lián)系所有符合的房東:
public class Client { @Test public void client() { MediumFacade facade = new MediumFacade(); facade.rentingHouse(800); } }
小結(jié)
有過面向?qū)ο箝_發(fā)經(jīng)驗(yàn)的同學(xué) 即使沒有聽說過外觀模式, 也完全有可能使用過他, 因?yàn)樗昝赖捏w現(xiàn)了依賴倒轉(zhuǎn)原則和迪米特法則的思想, 是非常常用的模式之一.
使用
首先 在設(shè)計(jì)初期, 應(yīng)該有意識的進(jìn)行層次分離, 比如經(jīng)典的三層架構(gòu), 層與層之間建立Facade, 這樣可以為復(fù)雜的子系統(tǒng)提供一個簡單的接口, 使耦合度大大降低.
其次 在開發(fā)階段, 子系統(tǒng)往往因?yàn)椴粩嗟闹貥?gòu)而變得越來越復(fù)雜, 增加Facade可以提供一個簡單的接口, 減少模塊間依賴.
第三 在維護(hù)一個遺留系統(tǒng)時, 可能這個系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展了, 但因?yàn)樗浅V匾墓δ? 新的需求必須依賴它, 此時可以為新系統(tǒng)開發(fā)一個Facade, 為設(shè)計(jì)粗糙或高復(fù)雜度的遺留代碼提供一個的比較清晰簡單的接口, 讓新系統(tǒng)與Facade交互, 而Facade與遺留代碼交互所有繁雜的工作.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)輸出任意整數(shù)的每一位
這篇文章主要介紹了java實(shí)現(xiàn)輸出任意整數(shù)的每一位,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01java 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實(shí)現(xiàn)方法)
下面小編就為大家?guī)硪黄猨ava 輸入一個數(shù)字,反轉(zhuǎn)輸出這個數(shù)字的值(實(shí)現(xiàn)方法)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式
這篇文章主要介紹了SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08