2011-09-24 62 views
0

我指的是可複用面向對象軟件上degign模式book元素由Eric Gamma值。然而,我理解了Facade模式的概念,但仍然無法理解本書給出的實現要點,因爲我對實現部分esp有點窮。門面設計模式 - 實現

的下面是在書中提到的2點:

  1. 減少客戶子系統耦合:通過使門面類的抽象類。

  2. 公共V/S專用子系統類。

可能有人請解釋一下我這有一些例子或者用我的代碼有:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Facade_CSharp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Facade facade = new Facade(); 

      facade.ProcessA(); 
      facade.ProcessB(); 

      // Wait for user 
      Console.ReadKey(); 
     } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassA' class 
    /// </summary> 
    class SubSystemOne 
    { 
    public void MethodOne() 
    { 
     Console.WriteLine(" SubSystem One"); 
    } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassB' class 
    /// </summary> 
    class SubSystemTwo 
    { 
    public void MethodTwo() 
    { 
     Console.WriteLine(" SubSystem Two"); 
    } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassC' class 
    /// </summary> 
    class SubSystemThree 
    { 
    public void MethodThree() 
    { 
     Console.WriteLine(" SubSystem Three"); 
    } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassD' class 
    /// </summary> 
    class SubSystemFour 
    { 
    public void MethodFour() 
    { 
     Console.WriteLine(" SubSystem Four"); 
    } 
    } 

    /// <summary> 
    /// The 'Facade' class 
    /// </summary> 
    class Facade 
    { 
    private SubSystemOne _one; 
    private SubSystemTwo _two; 
    private SubSystemThree _three; 
    private SubSystemFour _four; 

    public Facade() 
    { 
     Console.WriteLine("\nRequests received from Client System and Facade is in execution... "); 

     _one = new SubSystemOne(); 
     _two = new SubSystemTwo(); 
     _three = new SubSystemThree(); 
     _four = new SubSystemFour(); 
    } 

    public void ProcessA() 
    { 
     Console.WriteLine("\nProcessA of Facade uses the following subsystems to accomplish the task:"); 
     _one.MethodOne(); 
     _two.MethodTwo(); 
     _four.MethodFour(); 
    } 

    public void ProcessB() 
    { 
     Console.WriteLine("\nProcessB of Facade uses the following subsystems to accomplish the task:"); 
     _two.MethodTwo(); 
     _three.MethodThree(); 
    } 
    } 
} 

代碼與抽象類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Facade_abstract 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      FacadeAbs facade = new FacadeAbs(); 

      facade.ProcessA(); 
      facade.ProcessB(); 

      // Wait for user 
      Console.ReadKey(); 

     } 
    } 

    class SubSystemOne 
    { 
     public void MethodOne() 
     { 
      Console.WriteLine(" SubSystem One"); 
     } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassB' class 
    /// </summary> 
    class SubSystemTwo 
    { 
     public void MethodTwo() 
     { 
      Console.WriteLine(" SubSystem Two"); 
     } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassC' class 
    /// </summary> 
    class SubSystemThree 
    { 
     public void MethodThree() 
     { 
      Console.WriteLine(" SubSystem Three"); 
     } 
    } 

    /// <summary> 
    /// The 'Subsystem ClassD' class 
    /// </summary> 
    class SubSystemFour 
    { 
     public void MethodFour() 
     { 
      Console.WriteLine(" SubSystem Four"); 
     } 
    } 

    /// <summary> 
    /// The 'Facade' class 
    /// </summary> 
    public abstract class Facade 
    { 
     //public abstract Facade(); 

     public abstract void ProcessA(); 

     public abstract void ProcessB(); 

    } 

    public class FacadeAbs : Facade 
    { 
     private SubSystemOne _one; 
     private SubSystemTwo _two; 
     private SubSystemThree _three; 
     private SubSystemFour _four; 

     public FacadeAbs() 
     { 
      Console.WriteLine("\nRequests received from Client System and Facade is in execution... "); 

      _one = new SubSystemOne(); 
      _two = new SubSystemTwo(); 
      _three = new SubSystemThree(); 
      _four = new SubSystemFour(); 
     } 


     public override void ProcessA() 
     { 
      Console.WriteLine("\nProcessA of Facade uses the following subsystems to accomplish the task:"); 
      _one.MethodOne(); 
      _two.MethodTwo(); 
      _four.MethodFour(); 
     } 

     public override void ProcessB() 
     { 
      Console.WriteLine("\nProcessB of Facade uses the following subsystems to accomplish the task:"); 
      _two.MethodTwo(); 
      _three.MethodThree(); 
     } 

    } 
} 

回答

2

門面用來減少程序之間的耦合。

如示例ProcessA調用3個方法 -
_one.MethodOne();
_two.MethodTwo();
_four.MethodFour();

而客戶端只是調用ProcessA方法。 立面僅用於減少耦合,依賴性。

如果沒有門面的客戶端將是一個調用這些方法。

所以門面類提供了以下 -

  1. 隱藏多個呼叫。這有助於客戶必須進行一次通話。防止緊密耦合。例如僅適用於ProcessA
  2. 如果任何方法更改添加或刪除參數,則客戶端代碼需要更改。然而,在外觀的情況下,更改不會影響客戶端。
  3. 客戶端只有幾個公共訪問點到服務器端。服務器端可以封裝它的代碼。較少的失敗點。
+0

感謝,用於簡化對我來說。但是我的主要問題是製作門面類抽象的用法是什麼。抽象類如何在這方面提供幫助? –

+0

它不是強制將外觀層始終作爲抽象類。它們也可以是具體的類。抽象外觀類將有助於爲對象訪問其他對象和功能以及遵守它的實際實現提供默認接口。 – Jayendra

+0

嗨,我已經試過我的手在抽象類上,併發布上述相同程序的代碼...請檢查並讓我知道它的正確實施與否。 –