banner
jzman

jzman

Coding、思考、自觉。
github

外觀設計模式

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("烏龍茶");
    }
}

執行日誌如下:

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

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

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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。