外觀模式介紹
也叫門面模式,主要解決的是降低調用方的使用接口的復雜邏輯組合。有時候也會被用在中間件層,將服務中的通用性的復雜邏輯進行中間件層包裝,讓使用方可以只關心業務開發。可增強代碼的隔離性,以及復用性。
對於外觀模式的使用通常是用在復雜或多個接口進行包裝統一對外提供服務上。
說的通俗一點就是:外觀模式就是將一些復雜類的眾多可供調用的方法或接口進行高度的整合或集成,將其放到一個外部類中,並讓其業務方進行調用和使用。
就和上面電話購物一樣,調用者只需要知道電話號碼即可,其余的交給電話導購員,由她們去確認需要那些貨物,如何找到貨物,如何發貨等細節問題。這里的電話導購員其實就是貨物的外觀。
外觀模式結構
1、外觀 提供一種訪問特定子系統功能的便捷方式,其了解如何重定向客戶端請求,知曉如何操作一切活動部件。
2、創建附加外觀 類可以避免多種不相關的功能誤解單一外觀,使其變成又一個復雜結構。
3、復雜子系統 由數十個不同對象構成。如果要使用這些子系統模塊,那么就必須掌握其實現和關聯細節,比如正確的調用順序等。
4、客戶端 使用外觀代替對子系統對象的直接調用。
需要一個指向復雜子系統的直接接口,且該接口的功能有限,則可以使用外觀模式。
實現方式
-
考慮能否在現有子系統的基礎上提供一個更簡單的借口。如果該接口能讓客戶端代碼獨立於眾多子系統類,那么你的方向就是正確的。
-
在一個新的外觀類中聲明並實現該接口。外觀應將客戶端代碼的調用重定向到子系統中的相應對象處。如果客戶端代碼沒有對子系統進行初始化,也沒有對其后續生命周期進行管理,那么外觀必須完成此類工作。
-
如果要充分發揮這一模式的優勢,你必須確保所有客戶端代碼僅通過外觀來與子系統進行交互。此后客戶端代碼將不會受到任何由子系統代碼修改而造成的影響,比如子系統升級后,你只需修改外觀中的代碼即可。
-
如果外觀過於臃腫,你可以考慮將其部分行為抽取為一個新的專用外觀類。
外觀模式雖然降低了程序的整體復雜度,但它同時也有助於將不需要的依賴移動到同一位置。
Demo
- 子系統模塊
/// <summary>
/// 子系統模塊代碼 One
/// </summary>
public class SubSystemOne
{
public string operationOne()
{
return "我是One子系統中的模塊,你稍等片刻。\n";
}
public string operationOneN()
{
return "我是One子系統中的N模塊,你稍等片刻。\n";
}
}
/// <summary>
/// 子系統模塊代碼 Two
/// </summary>
public class SubSystemTwo
{
public string operationTwo()
{
return "我是Two子系統中的模塊,你稍等片刻。\n";
}
public string operationTwoS()
{
return "我是Two子系統中的S模塊,你稍等片刻。\n";
}
}
- 外觀類
/// <summary>
/// 外觀模式
/// </summary>
public class FacadeMode
{
protected SubSystemOne _one;
protected SubSystemTwo _two;
public FacadeMode(SubSystemOne one,SubSystemTwo two)
{
_one=one;
_two=two;
}
public string Operation()
{
string result = "外觀類輸出的:\n";
result += this._one.operationOne();
result += this._two.operationTwo();
result += "第二行:\n";
result += this._one.operationOneN();
result += this._two.operationTwoS();
return result;
}
}
- 客戶端
/// <summary>
/// 客戶端
/// </summary>
public class Client
{
public static void ClientCode(FacadeMode fMode)
{
Console.WriteLine(fMode.Operation());
}
}
class Program
{
static void Main(string[] args)
{
SubSystemOne one = new SubSystemOne();
SubSystemTwo two = new SubSystemTwo();
FacadeMode fMode = new FacadeMode(one,two);
Client.ClientCode(fMode);
Console.ReadKey();
}
}
具體代碼的流程圖
比較來看外觀模式還是比較簡單也很好理解的一種設計模式,在平常的調用第三方控件或接口的時候經常使用到這種模式,只是我們沒有留心觀察。它說的簡單點就是將一個復雜的系統,對其進行提煉需要的模塊或方法,將其整合為一個類的方法中供外部進行調用即可(有時候這個類需要管理其復雜模塊或系統的完整生命周期),這樣子使用者不需要知道內部類具體要干些什么,他只需要調用這個外部暴露的方法就可以。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。