外觀模式(或門面模式、包裝模式)是設計模式中非常朴素地體現面向對象“封裝”概念的模式,它的基本原理是將複雜的內部實現以統一介面的方式暴露出來,最大程度地減少客戶程式對某些子系統內部眾多對象的依賴關係。 外觀模式在開發過程中運用頻率非常高,比如各種第三方SDK大多會使用外觀模式。通過一個外觀類是的整個 ...
外觀模式(或門面模式、包裝模式)是設計模式中非常朴素地體現面向對象“封裝”概念的模式,它的基本原理是將複雜的內部實現以統一介面的方式暴露出來,最大程度地減少客戶程式對某些子系統內部眾多對象的依賴關係。
外觀模式在開發過程中運用頻率非常高,比如各種第三方SDK大多會使用外觀模式。通過一個外觀類是的整個系統的介面只有一個統一的高層介面,這樣能夠降低用戶的使用成本,也能夠對用戶屏蔽很多實現細節。
再比如經常會用到的三層結構也是外觀模式的應用。
GOF對外觀模式的描述為:
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
— Design Patterns : Elements of Reusable Object-Oriented Software
UML類圖:
通過外觀模式為子系統中的一組介面提供一個高層介面,該介面使子系統更易於使用。它的主要動機是減少“子系統”內部與外部間對象通信的依賴複雜程度
再比如電腦就是一個通過提供一個高層介面以屏蔽內部複雜性的例子,電腦包括CPU、硬碟、記憶體等各種部件,但作為用戶,不需要與這些零部件打交道,只需要按一下開機鍵,電腦就會啟動,只要點擊操作系統的關機按鈕,電腦就會關機。
電腦例子的代碼實現:
public class SubSystemBase
{
private string SubsystemName { get; set; }
public SubSystemBase(string subsystemName)
{
this.SubsystemName = subsystemName;
}
public void Startup()
{
Console.WriteLine($"{this.SubsystemName} startup");
}
public void Shutdown()
{
Console.WriteLine($"{this.SubsystemName} shutdown");
}
}
public class CPU : SubSystemBase
{
public CPU() : base("CPU") { }
}
public class Disk : SubSystemBase
{
public Disk() : base("Disk") { }
}
public class Memory : SubSystemBase
{
public Memory() : base("Memory") { }
}
//外觀模式提供的統一介面
public class ComputerFacade
{
CPU cpu = new CPU();
Disk disk = new Disk();
Memory memory = new Memory();
public void Startup()
{
cpu.Startup();
disk.Startup();
memory.Startup();
}
public void Shutdown()
{
cpu.Shutdown();
disk.Shutdown();
memory.Shutdown();
}
}
外觀模式的適用場景
- 為複雜的模塊或子系統提供外界訪問的模塊。
- 子系統相對獨立。
- 方便建立統一的開發規範。
外觀模式的優點
- 減少系統相互依賴。
- 提高靈活性。
- 提高了安全性、規範性。
外觀模式的缺點
外觀雖然有很多優點,但也不可避免地會有其固有的缺點,最主要的就是不符合開閉原則,如果要修改東西會很麻煩,關聯修改很多內容,這一點在三層架構就深有體會。
參考書籍:
王翔著 《設計模式——基於C#的工程化實現及擴展》