文章出處

索引

意圖

為子系統中的一組接口提供一個一致的界面,Facade 模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

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.

結構

參與者

Facade

  • 知道哪些子系統類負責處理請求。
  • 將客戶的請求代理給適當的子系統對象。

Subsystem Classes

  • 實現子系統的功能。
  • 處理由 Facade 對象指派的任務。
  • 沒有 Facade 的任何相關信息。

適用性

在以下情況下可以使用 Facade 模式:

  • 當你要為一個復雜子系統提供一個簡單接口時。
  • 客戶程序與抽象類的實現部分之間存在著很大的依賴性。
  • 當你需要構建一個層次結構的子系統時,使用 Facade 模式定義子系統中每層的入口點。

效果

  • 它對客戶屏蔽子系統組件,使用 Facade 的客戶程序不需要直接訪問子系統對象。
  • 它實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件往往是緊耦合的。
  • 如果應用需要,它并不限制它們使用子系統類。因此你可以在系統易用性和通用性之間加以選擇。

相關模式

  • Abstract Factory 模式可以與 Facade 模式一起使用以提供一個接口,這一接口可用來以一種子系統獨立的方式創建子系統對象。
  • Mediator 模式與 Facade 模式的相似之處是,它抽象了一些已有的類的功能。Mediator 的目的是對同事之間的任意通訊進行抽象,通常集中不屬于任何單個對象的功能。Facade 模式僅對子系統接口進行抽象,并不定義新功能。
  • 通常來講,可能僅需要一個 Facade 對象,因此可以用 Singleton 模式定義 Facade。

實現

實現方式(一):用抽象類定義 Facade 而使子類對應于不同的子系統。

將一個系統劃分成若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。

大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。

Facade 可以提供一個簡單的缺省視圖,這一視圖對于大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過 Facade 層。

用抽象類實現 Facade 而它的具體子類對應于不同的子系統實現,這可以進一步降低客戶與子系統的耦合度。

 1 namespace FacadePattern.Implementation1
 2 {
 3   public abstract class Facade
 4   {
 5     public abstract void Operation();
 6   }
 7 
 8   public class ConcreteFacade : Facade
 9   {
10     public override void Operation()
11     {
12       // we could use any factory here
13       // or use IoC here
14       SubsystemClassA subsystemClassA = new SubsystemClassA();
15       SubsystemClassB subsystemClassB = new SubsystemClassB();
16 
17       subsystemClassA.BehaviorA();
18       subsystemClassB.BehaviorB();
19     }
20   }
21 
22   public class SubsystemClassA
23   {
24     public void BehaviorA()
25     {
26       // do something
27     }
28   }
29 
30   public class SubsystemClassB
31   {
32     public void BehaviorB()
33     {
34       // do something
35     }
36   }
37 
38   public class Client
39   {
40     public void TestCase1()
41     {
42       Facade facade = new ConcreteFacade();
43       facade.Operation();
44     }
45   }
46 }

設計模式之美》為 Dennis Gao 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()