設計模式之外觀設計模式

NO IMAGE

PS:輸入倒逼輸出,想持續輸出就得持續輸入,每天的堅持很小,但是如果堅持一年呢,甚至更長時間呢,結果不一定很美好,但是過程一定很充實。

今天溫習一下外設計模式,提到外觀設計模式,就不得不提到設計模式的六大原則之一的迪米特法則,本篇文章將從如下幾個方面介紹外觀設計模式:

  1. 迪米特法則
  2. 如何理解外觀設計模式
  3. 實現外觀設計模式

迪米特法則

開發中經常會遇到類與類之間的關係越來越密切,耦合越來越大,導致當一個類發生變化時也會影響其他類,在設計模式六大原則中迪米特法則就是用來規範這種現象的,那什麼是迪米特法則呢?

迪米特法則(Law of Demeter)又叫做最少知識原則(LKP,Least Knowledge Principle),就是說一個對象應當對其他對象保持最少的瞭解。

迪米特法則還有一個更簡單的定義:只與直接的朋友進行通信,解釋一下什麼是直接的朋友,兩個對象之間是耦合關係,我們就說這兩個對象之間是朋友關係,耦合的關係有依賴、組合、聚合等,把出現成員變量、方法參數、方法返回值的類稱為直接的朋友,而 出現在局部變量中的對象則不是直接朋友,也就是說陌生的類最好不要出現在局部變量中。

如何理解外觀設計模式

外觀設計模式實際在開發中已經在使用,只是在潛意識裡沒有外觀設計模式這個概念,比如為了方便調用而對一些功能進行封裝,最後在一個管理類中統一對外提供,大多數工具類都應該用到了外觀設計模式。

歸根到底,外觀設計模式就是對一些廣泛用到的功能進行封裝,避免這部分內容頻繁的與其他對象產生耦合關係,通過封裝統一子系統的複雜性,只對外提供一個入口,以便其他模塊調用,這個是外觀設計模式的核心。

實現外觀設計模式

場景:茶館中有 A 、B、C 等顧客都需要泡茶喝,而且每個顧客每次泡茶的時候都得經過如下步驟才能泡好茶:

  1. 備具
  2. 備水
  3. 沖泡

每個顧客每次泡茶的時候都與茶具、茶葉、沸水等接觸,這明顯不符合迪米特法則,可以通過外觀設計模式封裝泡茶這個流程,也就是茶館裡面的服務員,每次喝茶的時候直接告訴茶館服務員想喝什麼茶就可以了,其他的泡茶細節顧客不需要知道,只要能夠喝到想要的茶就對了,下面使用這個案例額簡單實現一下外觀設計模式。泡茶流程如下:

/**
 * 備具
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareTeaSet {
    void prepareTeaSet();
}

class PrepareTeaSet implements IPrepareTeaSet {
    @Override
    public void prepareTeaSet() {
        System.out.println("備具...");
    }
}

/**
 * 備水
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareWater {
    void prepareWater();
}

class PrepareWater implements IPrepareWater {
    @Override
    public void prepareWater() {
        System.out.println("備水...");
    }
}

/**
 * 沖泡
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IBrewMethod {
    void brewMethod(String tea);
}

class BrewMethod implements IBrewMethod {

    @Override
    public void brewMethod(String tea) {
        System.out.println("沖泡..."+tea);
    }
}

對泡茶服務進行統一封裝對外提供泡茶服務,如下:

/**
 * 茶館泡茶服務
 * Created by jzman
 * Powered by 2019/5/6.
 */
class TeaHouse {
    // 統一泡茶服務
    public static void drinkTea(String tea){
        // 備具
        new PrepareTeaSet().prepareTeaSet();
        // 備水
        new PrepareWater().prepareWater();
        // 沖泡
        new BrewMethod().brewMethod(tea);
    }
}

最後顧客想喝什麼茶就點什麼茶,如下:

/**
 * 測試
 * Created by jzman
 * Powered by 2019/5/6.
 */
class FacadeMain {
    public static void main(String[] args) {
        // A
        TeaHouse.drinkTea("紅茶");
        // B
        TeaHouse.drinkTea("烏龍茶");
    }
}

執行日誌如下:

備具...
備水...
沖泡...紅茶

備具...
備水...
沖泡...烏龍茶

外觀設計模式的學習就到此為止,雖然平時的業務開發中也可能這樣寫,但是在潛意識裡面肯定不知道迪米特法則和外觀設計模式,通過輸入這樣的概念,就會在潛意識裡面去實踐這樣的規則。並不斷提高自己的編碼能力。

設計模式之外觀設計模式

相關文章

Github標星19K+Star,10分鐘自建對象存儲服務!

拖拽排列卡片組件

Vue中的組件從初始化到掛載經歷了什麼

如何寫好年終總結