外觀模式
定義:提供了一個統一的接口,用來訪問子系統中的一群接口,外觀定義了一個高層接口,讓子系統更容易使用。
舉例:我需要打開微信發送給某個好友某些內容,其中的過程包括了,下載微信,輸入賬號密碼,點擊登陸,找到好友,發送消息。這些整體封裝成了一個對外的方法,當我調用需要這個流程的時候,我通過一個方法的調用,直接就能實現全部的流程,不需要在請求方,去組合方法去完成這個操作。
設計原則:莫忒耳原則又稱最少知識原則,只和你的密友談話,通過“舉例”,可以明白這個原則的定義。
原則缺點:采用這個原則會導致更多的”包裝“對象被制造出來,以處理和其他組件的溝通,可能會導致復雜度和開發時間的增加,降低運行時性能
設計模式比較:外觀模式,適配器模式,裝飾者模式
適配器模式:當需要使用一個現有的類,但是接口並不符合要求,考慮使用適配器模式。將一個對象包裝起來改變接口。
外觀模式:當需要簡化並統一一個/一群很大的接口的時候,考慮使用外觀模式。依托與子系統執行。
裝飾着模式:將一個對象包裝起來,增加新的行為和責任。
代碼簡單舉例:
創建一個APPSotre的對象,來描述在APPStore內的操作
package com.appearancePattern; /** * @program: test * @description: 應用商店 * @author: Mr.Yang * @create: 2018-12-16 14:58 **/ public class AppStore { /** * 查找應用 * @param userName 應用名稱 */ public void findApp(String userName){ System.out.println("尋找應用名稱 appName : "+userName); } /** * 下載App */ public void downLoadApp(){ System.out.println("下載app"); } }
創建一個Wechat的對象,來描述在Wechat內的操作
package com.appearancePattern; /** * @program: test * @description: 微信方法封裝類 * @author: Mr.Yang * @create: 2018-12-16 14:54 **/ public class Wechat { /** * 輸入微信賬號密碼 * @param userName 微信賬號 * @param passWord 微信密碼 */ public void inputNamePass(String userName,String passWord){ System.out.println("輸入賬號密碼:userName:"+userName+" 密碼:"+passWord); } /** * 點擊登陸 */ public void clickLogin(){ System.out.println("點擊登陸"); } /** * 查找用戶 */ public void findUser(String userName){ System.out.println("查找用戶 userName : "+userName); } /** * 發送消息 * @param message 消息內容 */ public void sendMessage(String message){ System.out.println("發送消息:message : "+message); } }
利用統一組裝方法做個修飾,對外暴露一個完整功能-外觀模式
package com.appearancePattern; /** * @program: test * @description: 外觀封裝類 * @author: Mr.Yang * @create: 2018-12-16 15:01 **/ public class AppearanceEnc { AppStore appStore; Wechat wechat; public AppearanceEnc(AppStore appStore,Wechat wechat){ this.appStore=appStore; this.wechat=wechat; } /** * 組裝發送消息的操作 */ public void encSendMessage(){ appStore.findApp("wechat"); appStore.downLoadApp(); wechat.inputNamePass("測試","123"); wechat.clickLogin(); wechat.findUser("小明"); wechat.sendMessage("在嗎?借點錢"); } }
模擬調用方--測試
package com.appearancePattern; /** * @program: test * @description: 客戶端測試類 * @author: Mr.Yang * @create: 2018-12-16 15:04 **/ public class Test { /** * 使用了外觀模式,不僅提供了一個簡化的接口訪問,還可以進行單獨的接口訪問。 * 外觀模式的特征:提供簡化接口的同時,依然將系統完整的功能暴露出來,以共需要的程序使用 * @param args */ public static void main(String[] args) { AppStore appStore = new AppStore(); Wechat wechat = new Wechat(); AppearanceEnc appearanceEnc = new AppearanceEnc(appStore,wechat); appearanceEnc.encSendMessage(); } /* *//** * 客戶端測試,如果沒有做一個統一方法的組合處理,客戶端代碼會變得很多。 * @param args *//* public static void main(String[] args) { AppStore appStore = new AppStore(); Wechat wechat = new Wechat(); appStore.findApp("wechat"); appStore.downLoadApp(); wechat.inputNamePass("測試","123"); wechat.clickLogin(); wechat.findUser("小明"); wechat.sendMessage("在嗎?借點錢"); }*/ }
得到測試結果:
尋找應用名稱 appName : wechat 下載app 輸入賬號密碼:userName:測試 密碼:123 點擊登陸 查找用戶 userName : 小明 發送消息:message : 在嗎?借點錢
外觀模式總結:
外觀模式允許從客戶實現從子系統中解耦,比如:微信多了個登陸驗證功能,我們只需要改變外觀的代碼就能實現,客戶代碼是針對於外觀模式的,而不是針對自己系統來做的操作。
知而好學,然后能才。
-----荀況