外觀模式

外观模式(Facade pattern),是軟件工程中常用的一種軟件設計模式,它為子系統中的一組介面提供一個統一的高層介面,使得子系統更容易使用。

外观模式是一个设计模式 (计算机)中常用的面向对象程序设计. 类似于一个建筑学中的立面. 立面作为一个前端接口来屏蔽更复杂的底层或结构代码。外观模式可以:

  • 通用简化的API屏蔽与更复杂的内部组件和结构, 以提高Software library的可读性和可用性
  • 为更通用的功能提供上下文特定的接口
  • 在广泛更新重构单层系统(Monolithic System)或紧密耦合(tight coupling)的軟件系统, 提供一个简化的启动点,更有利于更多的松耦合(loose coupling)代码

当一个系统非常复杂或难以理解时,开发人员通常会使用 facade 设计模式,因为该系统有许多相互依赖的类,或者因为其源代码不可用。Facade模式隐藏了更大系统的复杂性,为客户端提供了一个更简单的接口。通常会涉及到一个wrapper包含客户端所需的一组成员的。这些成员代表 facade 客户端访问系统并隐藏实现细节。

結構

[编辑]

Facade
這個外觀類為子系統中Packages 1、2、3提供一個共同的對外介面(接口
Clients
客戶對象通過一個外觀介面讀寫子系統中各介面的數據資源
Packages
客戶可以通過外觀介面讀取的内部庫。

示例

[编辑]

Java

[编辑]

這是一個抽象的範例。一個客戶“you”通過外觀介面“computer”獲取計算機内部複雜的系統信息

/* Complex parts */  class CPU { 	public void freeze() { ... } 	public void jump(long position) { ... } 	public void execute() { ... } }  class Memory { 	public void load(long position, byte[] data) { 		... 	} }  class HardDrive { 	public byte[] read(long lba, int size) { 		... 	} }  /* Façade */  class Computer { 	public void startComputer() { 		cpu.freeze(); 		memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); 		cpu.jump(BOOT_ADDRESS); 		cpu.execute(); 	} }  /* Client */  class You { 	public static void main(String[] args) { 		Computer facade = new Computer(); 		facade.startComputer(); 	} } 

C#

[编辑]
// Facade pattern -- Structural example   using System;  namespace DoFactory.GangOfFour.Facade.Structural {    // Mainapp test application     class MainApp   {     public static void Main()     {       Facade facade = new Facade();        facade.MethodA();       facade.MethodB();        // Wait for user        Console.Read();     }   }    // "Subsystem ClassA"     class SubSystemOne   {     public void MethodOne()     {       Console.WriteLine(" SubSystemOne Method");     }   }    // Subsystem ClassB"     class SubSystemTwo   {     public void MethodTwo()     {       Console.WriteLine(" SubSystemTwo Method");     }   }    // Subsystem ClassC"     class SubSystemThree   {     public void MethodThree()     {       Console.WriteLine(" SubSystemThree Method");     }   }    // Subsystem ClassD"     class SubSystemFour   {     public void MethodFour()     {       Console.WriteLine(" SubSystemFour Method");     }   }    // "Facade"     class Facade   {     SubSystemOne one;     SubSystemTwo two;     SubSystemThree three;     SubSystemFour four;      public Facade()     {       one = new SubSystemOne();       two = new SubSystemTwo();       three = new SubSystemThree();       four = new SubSystemFour();     }      public void MethodA()     {       Console.WriteLine("\nMethodA() ---- ");       one.MethodOne();       two.MethodTwo();       four.MethodFour();     }      public void MethodB()     {       Console.WriteLine("\nMethodB() ---- ");       two.MethodTwo();       three.MethodThree();     }   } } 

C++

[编辑]
class CPU { public: 	void freeze() { ... } 	void jump(long position) { ... } 	void execute() { ... } }  class Memory { public: 	void load(long position, char* data) { 		... 	} }  class HardDrive { public: 	char* read(long lba, int size) { 		... 	} }  /* Façade */  class Computer { public: 	void startComputer() { 		cpu.freeze(); 		memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); 		cpu.jump(BOOT_ADDRESS); 		cpu.execute(); 	} }  /* Client */  class You { public: 	void start(String[] args) { 		Computer facade = new Computer(); 		facade.startComputer(); 	} }