程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 解析C#設計形式編程中外不雅形式Facade Pattern的運用

解析C#設計形式編程中外不雅形式Facade Pattern的運用

編輯:C#入門知識

解析C#設計形式編程中外不雅形式Facade Pattern的運用。本站提示廣大學習愛好者:(解析C#設計形式編程中外不雅形式Facade Pattern的運用)文章只能為提供參考,不一定能成為您想要的結果。以下是解析C#設計形式編程中外不雅形式Facade Pattern的運用正文


實例引入
在家庭影院中,有燈光,屏幕,投影機,功放機,DVD 播放器這幾個根本的對象:

  • 燈光,可以封閉燈光和翻開燈光。
  • 投影機,可以翻開和封閉投影機。
  • 屏幕,可以翻開和封閉。
  • 功放機,可以封閉音量和翻開音量。
  • DVD 播放器,可以翻開播放器和封閉播放器。

  以最通俗的方法完成不雅看片子,類圖以下所示:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810343886.jpg (640×309)

依照類圖所示,假如要不雅看片子,必需在客戶端履行上面的操作:先翻開投影儀,再翻開功放機,再翻開屏幕,再翻開 DVD 播放機,再翻開燈光,在閱歷了這麼多操作後,才可以看一場片子。而在封閉片子的時刻,也要先封閉投影儀,再封閉功放機,再封閉屏幕,再封閉 DVD 播放機,再封閉燈光。哦,這是太龐雜了!!!在客戶端竟然有那末多操作,假如有一些用戶不曉得若何應用個中的一個對象,那他便看不了片子!

  下面其實反應的是當今軟件開辟體系中的一個比擬罕見的景象,客戶端法式常常和龐雜體系的外部子體系發生直接接洽,招致客戶法式跟著子體系的變更而變更。要想處理下面的這一串成績,必需要簡化客戶法式與子體系之間的交互接口,消除客戶法式和子體系之間的耦合,而外不雅形式正好可以處理這個成績。

  外不雅形式(Facade)的界說:為子體系中的一組接口供給一個分歧的界面,用來拜訪子體系中的一群接口。

  此形式界說了一個高層的接口,這個接口使得這一子體系加倍輕易應用。簡略的說,就是外不雅形式將一個或許多個類的龐雜的操作停止了隱蔽,只顯示出一個分歧的界面供客戶端應用。須要留意的是,外不雅形式僅僅是給你供給了更加直接和輕易的操作方法,它並沒有把本來的子體系停止隔離,所以,假如你還須要子體系類的更高層的功效,照樣可使用本來的子體系的,這個是外不雅形式的一年夜長處。經由過程外不雅形式可以將子體系的多個接口上樹立一個高層接口,而且將這個高層接口供給給客戶端應用,如許即可以消除失落客戶端和龐雜子體系之間的耦合。

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810343814.jpg (685×401)

  經由過程上圖可以看出,外不雅形式完成供給簡略的接口(OpenMovie 和 CloseMovie)給客戶端,也給客戶端和子體系之間完成懂得耦。上面經由過程代碼來完成下面的這個 Demo。

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810343934.jpg (738×423)

幾個播下班具的代碼:

using System;
namespace Facade 
{ 
  /// <summary> 
  /// 投影儀 
  /// </summary> 
  public class Projector 
  { 
    public void OpenProjector() 
    { 
      Console.WriteLine("翻開投影儀"); 
    }
    public void CloseProjector() 
    { 
      Console.WriteLine("封閉投影儀"); 
    }
    public void SetWideScreen() 
    { 
      Console.WriteLine("投影儀狀況為寬屏形式"); 
    }
    public void SetStandardScreen() 
    { 
      Console.WriteLine("投影儀狀況為尺度形式"); 
    } 
  } 
}
     
     
using System;
namespace Facade 
{ 
  /// <summary> 
  /// 功放機 
  /// </summary> 
  public class Amplifier 
  { 
    public void OpenAmplifier() 
    { 
      Console.WriteLine("翻開功放機"); 
    }
    public void CloseAmplifier() 
    { 
      Console.WriteLine("封閉功放機"); 
    } 
  } 
}
       
        
using System;
namespace Facade 
{ 
  /// <summary> 
  /// 屏幕 
  /// </summary> 
  public class Screen 
  { 
    public void OpenScreen() 
    { 
      Console.WriteLine("翻開屏幕"); 
    }
    public void CloseScreen() 
    { 
      Console.WriteLine("封閉屏幕"); 
    } 
  } 
}
        
        
using System;
namespace Facade 
{ 
  /// <summary> 
  /// DVD播放器 
  /// </summary> 
  public class DVDPlayer 
  { 
    public void OpenDVDPlayer() 
    { 
      Console.WriteLine("翻開 DVD 播放器"); 
    }
    public void CloseDVDPlayer() 
    { 
      Console.WriteLine("封閉 DVD 播放器"); 
    } 
  } 
}
        
       
using System;
namespace Facade 
{ 
  /// <summary> 
  /// 燈光 
  /// </summary> 
  public class Light 
  { 
    public void OpenLight() 
    { 
      Console.WriteLine("翻開燈光"); 
    }
    public void CloseLight() 
    { 
      Console.WriteLine("封閉燈光"); 
    } 
  } 
}

  外不雅類中的代碼:

namespace Facade 
{ 
  /// <summary> 
  /// 界說一個外不雅 
  /// </summary> 
  public class MovieFacade 
  { 
    /// <summary> 
    /// 在外不雅類中必需保留有子體系中各個對象 
    /// </summary> 
    private Projector projector; 
    private Amplifier amplifier; 
    private Screen screen; 
    private DVDPlayer dvdPlayer; 
    private Light light;
    public MovieFacade() 
    { 
      projector = new Projector(); 
      amplifier = new Amplifier(); 
      screen = new Screen(); 
      dvdPlayer = new DVDPlayer(); 
      light = new Light(); 
    }
    /// <summary> 
    /// 翻開片子 
    /// </summary> 
    public void OpenMovie() 
    { 
      //先翻開投影儀 
      projector.OpenProjector(); 
      //再翻開功放 
      amplifier.OpenAmplifier(); 
      //再翻開屏幕 
      screen.OpenScreen(); 
      //再翻開 DVD 
      dvdPlayer.OpenDVDPlayer(); 
      //再翻開燈光 
      light.OpenLight(); 
    }
    /// <summary> 
    /// 封閉片子 
    /// </summary> 
    public void CloseMovie() 
    { 
      //封閉投影儀 
      projector.CloseProjector(); 
      //封閉功放 
      amplifier.CloseAmplifier(); 
      //封閉屏幕 
      screen.CloseScreen(); 
      //封閉 DVD 
      dvdPlayer.CloseDVDPlayer(); 
      //封閉燈光 
      light.CloseLight(); 
    } 
  } 
}

  客戶端代碼:

using System;
namespace FacadeTest 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Facade.MovieFacade movie = new Facade.MovieFacade(); 
      Facade.Projector projector = new Facade.Projector();
        
      //起首是不雅看片子 
      movie.OpenMovie();
      Console.WriteLine();
       
      //然後是將投影儀形式調到寬屏形式 
      projector.SetWideScreen(); 
      //再將投影儀形式調回通俗形式 
      projector.SetStandardScreen(); 
      Console.WriteLine();
      
      //最初就是封閉片子了 
      movie.CloseMovie();
      Console.ReadKey(); 
    } 
  } 
}

  從上例中可以看出,可以在客戶端中應用子體系中的內容,即外不雅形式並沒有把子體系和客戶端隔分開來,只是供給了整潔的接口給客戶端,假如客戶端想拜訪龐雜子體系中的接口時照樣一樣的可以拜訪的。好比在下面的 Demo 中的設置了寬屏和通俗等形式。

外不雅形式的構造總結
看完外不雅形式的完成以後,為了贊助理清外不雅形式中類之間的關系,上面給出下面完成代碼中類圖:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810343933.png (626×363)

但是關於外不雅形式而言,是沒有一個普通化的類圖描寫,上面演示一個外不雅形式的表示性對象圖來加深年夜家對外不雅形式的懂得:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810343941.png (433×292)

在下面的對象圖中有兩個腳色:

門面(Facade)腳色:客戶端挪用這個腳色的辦法。該腳色曉得相干的一個或多個子體系的功效和義務,該腳色會將從客戶端發來的要求委派帶響應的子體系中去。

子體系(subsystem)腳色:可以同時包括一個或多個子體系。每一個子體系都不是一個零丁的類,而是一個類的聚集。每一個子體系都可以被客戶端直接挪用或被門面腳色挪用。關於子體系而言,門面僅僅是別的一個客戶端,子體系其實不曉得門面的存在。

外不雅的優缺陷
長處:

外不雅形式對客戶屏障了子體系組件,從而簡化了接口,削減了客戶處置的對象數量並使子體系的應用加倍簡略。
外不雅形式完成了子體系與客戶之間的松耦合關系,而子體系外部的功效組件是緊耦合的。松耦合使得子體系的組件變更不會影響到它的客戶。
缺陷:

假如增長新的子體系能夠須要修正外不雅類或客戶真個源代碼,如許就違反了”開——閉准繩“(不外這點也是弗成防止)。


應用場景
在以下情形下可以斟酌應用外不雅形式:

外一個龐雜的子體系供給一個簡略的接口
供給子體系的自力性
在條理化構造中,可使用外不雅形式界說體系中每層的進口。個中三層架構就是如許的一個例子。

總結
到這裡外不雅形式的引見就停止了,外不雅形式,為子體系的一組接口供給一個同一的接口,該形式界說了一個高層接口,這一個高層接口使的子體系加倍輕易應用。而且外不雅形式可以處理層構造分別、下降體系耦合度和為新舊體系交互供給接口功效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved