PS:輸入倒逼輸出,想持續輸出就得持續輸入,每天的堅持很小,但是如果堅持一年呢,甚至更長時間呢,結果不一定很美好,但是過程一定很充實。
今天溫習一下外設計模式,提到外觀設計模式,就不得不提到設計模式的六大原則之一的迪米特法則,本篇文章將從如下幾個方面介紹外觀設計模式:
- 迪米特法則
- 如何理解外觀設計模式
- 實現外觀設計模式
迪米特法則#
開發中經常會遇到類與類之間的關係越來越密切,耦合越來越大,導致當一個類發生變化時也會影響其他類,在設計模式六大原則中迪米特法則就是用來規範這種現象的,那什麼是迪米特法則呢?
迪米特法則(Law of Demeter)又叫做最少知識原則(LKP,Least Knowledge Principle),就是說一個對象應當對其他對象保持最少的了解。
迪米特法則還有一個更簡單的定義:只與直接的朋友進行通信,解釋一下什麼是直接的朋友,兩個對象之間是耦合關係,我們就說這兩個對象之間是朋友關係,耦合的關係有依賴、組合、聚合等,把出現成員變量、方法參數、方法返回值的類稱為直接的朋友,而 出現在局部變量中的對象則不是直接朋友,也就是說陌生的類最好不要出現在局部變量中。
如何理解外觀設計模式#
外觀設計模式實際在開發中已經在使用,只是在潛意識裡沒有外觀設計模式這個概念,比如為了方便調用而對一些功能進行封裝,最後在一個管理類中統一對外提供,大多數工具類都應該用到了外觀設計模式。
歸根到底,外觀設計模式就是對一些廣泛用到的功能進行封裝,避免這部分內容頻繁的與其他對象產生耦合關係,通過封裝統一子系統的複雜性,只對外提供一個入口,以便其他模塊調用,這個是外觀設計模式的核心。
實現外觀設計模式#
場景:茶館中有 A 、B、C 等顧客都需要泡茶喝,而且每個顧客每次泡茶的時候都得經過如下步驟才能泡好茶:
- 備具
- 備水
- 沖泡
每個顧客每次泡茶的時候都與茶具、茶葉、沸水等接觸,這明顯不符合迪米特法則,可以通過外觀設計模式封裝泡茶這個流程,也就是茶館裡面的服務員,每次喝茶的時候直接告訴茶館服務員想喝什麼茶就可以了,其他的泡茶細節顧客不需要知道,只要能夠喝到想要的茶就對了,下面使用這個案例額簡單實現一下外觀設計模式。泡茶流程如下:
/**
* 備具
* 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("烏龍茶");
}
}
執行日誌如下:
備具...
備水...
沖泡...紅茶
備具...
備水...
沖泡...烏龍茶
外觀設計模式的學習就到此為止,雖然平時的業務開發中也可能這樣寫,但是在潛意識裡面肯定不知道迪米特法則和外觀設計模式,通過輸入這樣的概念,就會在潛意識裡面去實踐這樣的規則,並不斷提高自己的編碼能力。