外觀模式的介紹以及與適配器模式和裝飾者模式的區別


 

外觀模式
定義:提供了一個統一的接口,用來訪問子系統中的一群接口,外觀定義了一個高層接口,讓子系統更容易使用。

舉例:我需要打開微信發送給某個好友某些內容,其中的過程包括了,下載微信,輸入賬號密碼,點擊登陸,找到好友,發送消息。這些整體封裝成了一個對外的方法,當我調用需要這個流程的時候,我通過一個方法的調用,直接就能實現全部的流程,不需要在請求方,去組合方法去完成這個操作。

設計原則:莫忒耳原則又稱最少知識原則,只和你的密友談話,通過“舉例”,可以明白這個原則的定義。

原則缺點:采用這個原則會導致更多的”包裝“對象被制造出來,以處理和其他組件的溝通,可能會導致復雜度和開發時間的增加,降低運行時性能

設計模式比較:外觀模式,適配器模式,裝飾者模式
適配器模式:當需要使用一個現有的類,但是接口並不符合要求,考慮使用適配器模式。將一個對象包裝起來改變接口。
外觀模式:當需要簡化並統一一個/一群很大的接口的時候,考慮使用外觀模式。依托與子系統執行。
裝飾着模式:將一個對象包裝起來,增加新的行為和責任。
代碼簡單舉例:

創建一個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 : 在嗎?借點錢
 

外觀模式總結:

外觀模式允許從客戶實現從子系統中解耦,比如:微信多了個登陸驗證功能,我們只需要改變外觀的代碼就能實現,客戶代碼是針對於外觀模式的,而不是針對自己系統來做的操作。

                              

                              知而好學,然后能才。

                                                                      -----荀況

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM