亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

解析C#設計模式編程中外觀模式Facade Pattern的應用

2020-01-24 01:16:02
字體:
來源:轉載
供稿:網友

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

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

  以最普通的方式實現觀看電影,類圖如下所示:

201621994222971.jpg (640×309)

按照類圖所示,如果要觀看電影,必須在客戶端執行下面的操作:先打開投影儀,再打開功放機,再打開屏幕,再打開 DVD 播放機,再打開燈光,在經歷了這么多操作后,才可以看一場電影。而在關閉電影的時候,也要先關閉投影儀,再關閉功放機,再關閉屏幕,再關閉 DVD 播放機,再關閉燈光。哦,這是太復雜了?。?!在客戶端居然有那么多操作,如果有一些用戶不知道如何使用其中的一個工具,那他便看不了電影!

  上面其實反映的是現今軟件開發系統中的一個比較常見的現象,客戶端程序經常和復雜系統的內部子系統產生直接聯系,導致客戶程序隨著子系統的變化而變化。要想解決上面的這一串問題,必須要簡化客戶程序與子系統之間的交互接口,解除客戶程序和子系統之間的耦合,而外觀模式正好可以解決這個問題。

  外觀模式(Facade)的定義:為子系統中的一組接口提供一個一致的界面,用來訪問子系統中的一群接口。

  此模式定義了一個高層的接口,這個接口使得這一子系統更加容易使用。簡單的說,就是外觀模式將一個或者多個類的復雜的操作進行了隱藏,只顯示出一個一致的界面供客戶端使用。需要注意的是,外觀模式僅僅是給你提供了更為直接和容易的操作方式,它并沒有把原來的子系統進行隔離,所以,如果你還需要子系統類的更高層的功能,還是可以使用原來的子系統的,這個是外觀模式的一大優點。通過外觀模式可以將子系統的多個接口上建立一個高層接口,并且將這個高層接口提供給客戶端使用,這樣便可以解除掉客戶端和復雜子系統之間的耦合。

201621994349141.jpg (685×401)

  通過上圖可以看出,外觀模式實現提供簡單的接口(OpenMovie 和 CloseMovie)給客戶端,也給客戶端和子系統之間實現了解耦。下面通過代碼來實現上面的這個 Demo。

201621994410364.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 中的設置了寬屏和普通等模式。

外觀模式的結構總結
看完外觀模式的實現之后,為了幫助理清外觀模式中類之間的關系,下面給出上面實現代碼中類圖:

201621994508122.png (626×363)

然而對于外觀模式而言,是沒有一個一般化的類圖描述,下面演示一個外觀模式的示意性對象圖來加深大家對外觀模式的理解:

201621994528100.png (433×292)

在上面的對象圖中有兩個角色:

門面(Facade)角色:客戶端調用這個角色的方法。該角色知道相關的一個或多個子系統的功能和責任,該角色會將從客戶端發來的請求委派帶相應的子系統中去。

子系統(subsystem)角色:可以同時包含一個或多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合。每個子系統都可以被客戶端直接調用或被門面角色調用。對于子系統而言,門面僅僅是另外一個客戶端,子系統并不知道門面的存在。

外觀的優缺點
優點:

外觀模式對客戶屏蔽了子系統組件,從而簡化了接口,減少了客戶處理的對象數目并使子系統的使用更加簡單。
外觀模式實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件是緊耦合的。松耦合使得子系統的組件變化不會影響到它的客戶。
缺點:

如果增加新的子系統可能需要修改外觀類或客戶端的源代碼,這樣就違背了”開――閉原則“(不過這點也是不可避免)。


使用場景
在以下情況下可以考慮使用外觀模式:

外一個復雜的子系統提供一個簡單的接口
提供子系統的獨立性
在層次化結構中,可以使用外觀模式定義系統中每一層的入口。其中三層架構就是這樣的一個例子。

總結
到這里外觀模式的介紹就結束了,外觀模式,為子系統的一組接口提供一個統一的接口,該模式定義了一個高層接口,這一個高層接口使的子系統更加容易使用。并且外觀模式可以解決層結構分離、降低系統耦合度和為新舊系統交互提供接口功能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲精品在线视频| 成人女保姆的销魂服务| 欧美一级淫片丝袜脚交| 午夜精品一区二区三区视频免费看| 国产精品久久久久久久久免费| 2019国产精品自在线拍国产不卡| 亚洲va码欧洲m码| 久久精品国产综合| 国产小视频国产精品| 国产精品扒开腿做爽爽爽男男| 91禁外国网站| 欧美日韩在线看| 一本一本久久a久久精品牛牛影视| 久久资源免费视频| 亚洲人成绝费网站色www| 色综合色综合久久综合频道88| 91久久久久久久一区二区| 欧美视频在线观看 亚洲欧| 日韩激情视频在线| 国产精品第七十二页| 亚洲成人黄色在线观看| 国产91在线播放精品91| 亚洲色图欧美制服丝袜另类第一页| 亚洲国产日韩欧美在线动漫| 亚洲自拍偷拍网址| 亚洲一级免费视频| 成人a在线视频| 热久久美女精品天天吊色| 92裸体在线视频网站| 欧美亚洲日本黄色| 欧美日韩国产中文精品字幕自在自线| 国产亚洲精品激情久久| 91最新在线免费观看| 日韩欧美国产骚| 亚洲精品720p| 国产精品亚洲аv天堂网| 欧美激情精品久久久久久免费印度| 亚洲成人久久久| 日韩在线视频观看正片免费网站| 日韩在线不卡视频| 欧美性少妇18aaaa视频| 国产精品免费久久久| 日韩精品视频三区| 亚洲香蕉伊综合在人在线视看| 欧美日韩国产麻豆| 国产精品亚洲视频在线观看| 欧美福利视频在线| 国产69久久精品成人| 欧美影院成年免费版| 91精品在线看| 激情懂色av一区av二区av| 国产在线观看一区二区三区| 亚洲美女av在线| 91精品国产乱码久久久久久久久| 久久久久久亚洲精品中文字幕| 国产精品一久久香蕉国产线看观看| 久久人人爽人人爽人人片av高请| 亚洲精品自产拍| 国产精品最新在线观看| 欧美美女操人视频| 国产成人一区二区三区小说| 一区二区国产精品视频| 久久人人97超碰精品888| 欧美大片在线影院| 日韩精品中文字| 国产女人精品视频| 精品亚洲夜色av98在线观看| 亚洲国产精品成人va在线观看| 57pao国产精品一区| 日本中文字幕不卡免费| 最近2019年好看中文字幕视频| 亚洲天堂成人在线| 国产91色在线| 国产主播喷水一区二区| 中文.日本.精品| 亚洲激情国产精品| 中文字幕亚洲情99在线| 成人免费自拍视频| 亚洲欧美日本伦理| 久久久久久国产精品| 国产精品一区二区在线| 精品国内自产拍在线观看| 亚洲精品久久久一区二区三区| 亚洲一区二区三区视频播放| 日韩精品免费一线在线观看| 国产精品黄色av| 亚洲无限av看| 国产成人精品a视频一区www| 国产成人精彩在线视频九色| 国产一区二区三区中文| 亚洲第一视频网站| 久久久精品国产网站| 午夜剧场成人观在线视频免费观看| 久久久免费高清电视剧观看| 色悠久久久久综合先锋影音下载| 青青草国产精品一区二区| 91亚洲国产成人精品性色| 亚洲欧美中文日韩在线v日本| 日本高清+成人网在线观看| 91精品视频在线| 亚洲欧美成人一区二区在线电影| www.久久撸.com| 欧美一级淫片aaaaaaa视频| 91网站免费观看| 韩国视频理论视频久久| 欧美丝袜第一区| 久久久久久久色| 欧美中文字幕在线观看| 亚洲精品电影网在线观看| 精品国产999| 国产亚洲一区二区精品| 久久久久久久爱| 国产精品女人网站| 国产美女91呻吟求| 日韩成人久久久| 日韩精品在线免费观看| 亚洲无亚洲人成网站77777| 欧美亚洲国产成人精品| 亚洲一级片在线看| 欧美性在线观看| 91精品视频在线免费观看| 日韩av电影国产| 久久久久这里只有精品| 在线播放日韩专区| 亚洲男女性事视频| 精品高清美女精品国产区| 日本中文字幕久久看| 国产精品专区h在线观看| 国产一区二区三区视频在线观看| 中文字幕精品www乱入免费视频| 午夜精品久久久久久久99热浪潮| 97国产在线视频| 久久视频在线免费观看| 一道本无吗dⅴd在线播放一区| 亚洲a级在线播放观看| 日韩一中文字幕| 日本免费在线精品| 久久91精品国产91久久久| 8x海外华人永久免费日韩内陆视频| 亚洲图片制服诱惑| 日韩精品久久久久| 日韩av网址在线| 一本色道久久综合亚洲精品小说| 97国产在线观看| 欧美激情中文网| 性欧美亚洲xxxx乳在线观看| 欧美日本精品在线| 夜夜躁日日躁狠狠久久88av| 欧美精品在线免费| 性欧美办公室18xxxxhd| 成人黄色片在线| 国产精品va在线播放我和闺蜜| 日韩电影中文字幕av| 91爱爱小视频k| 日韩专区中文字幕| 影音先锋日韩有码| 最近2019中文免费高清视频观看www99| 成人高清视频观看www| www欧美日韩| 欧美在线观看网址综合| 国产偷亚洲偷欧美偷精品| 午夜精品一区二区三区视频免费看| 韩国视频理论视频久久| 亚洲欧美色婷婷|