成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP設計模式(九)外觀模式Facade實例詳解【結構型】

瀏覽:168日期:2022-09-10 14:34:23

本文實例講述了PHP設計模式:外觀模式Facade。分享給大家供大家參考,具體如下:

1. 概述

外觀模式,我們通過外觀的包裝,使應用程序只能看到外觀對象,而不會看到具體的細節對象,這樣無疑會降低應用程序的復雜度,并且提高了程序的可維護性。例子1:一個電源總開關可以控制四盞燈、一個風扇、一臺空調和一臺電視機的啟動和關閉。該電源總開關可以同時控制上述所有電器設備,電源總開關即為該系統的外觀模式設計。

2. 問題

為了降低復雜性,常常將系統劃分為若干個子系統。但是如何做到各個系統之間的通信和相互依賴關系達到最小呢?

3. 解決方案

外觀模式:為子系統中的一組接口提供一個一致的界面, Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。引入外觀角色之后,用戶只需要直接與外觀角色交互,用戶與子系統之間的復雜關系由外觀角色來實現,從而降低了系統的耦合度。

PHP設計模式(九)外觀模式Facade實例詳解【結構型】

4. 適用性

在遇到以下情況使用facade模式: 1) 當你要為一個復雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的類。 這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。facade可以提供一個簡單的缺省視圖, 這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過facade層。 2) 客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入 facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性 和可移植性。 3) 當你需要構建一個層次結構的子系統時,使用 facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關系。

5. 結構

PHP設計模式(九)外觀模式Facade實例詳解【結構型】

PHP設計模式(九)外觀模式Facade實例詳解【結構型】

6.構建模式的組成

外觀角色(Facade):是模式的核心,他被客戶client角色調用,知道各個子系統的功能。同時根據客戶角色已有的需求預訂了幾種功能組合子系統角色(Subsystem classes):實現子系統的功能,并處理由Facade對象指派的任務。對子系統而言,facade和client角色是未知的,沒有Facade的任何相關信息;即沒有指向Facade的實例。客戶角色(client):調用facade角色獲得完成相應的功能。

7. 效果

Facade模式有下面一些優點:

1)對客戶屏蔽子系統組件,減少了客戶處理的對象數目并使得子系統使用起來更加容易。通過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也很少。2)實現了子系統與客戶之間的松耦合關系,這使得子系統的組件變化不會影響到調用它的客戶類,只需要調整外觀類即可。 3)降低了大型軟件系統中的編譯依賴性,并簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統一般不需要編譯所有其他的子系統。一個子系統的修改對其他子系統沒有任何影響,而且子系統內部變化也不會影響到外觀對象。 4)只是提供了一個訪問子系統的統一入口,并不影響用戶直接使用子系統類。 Facade模式的缺點 1) 不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。 2) 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。

8. 實現

我們使用開關的例子;

<?php /** * 外觀模式 * */ class SwitchFacade{private $_light = null; //電燈private $_ac = null;//空調private $_fan = null;//電扇private $_tv = null;//電視public function __construct(){$this->_light = new Light();$this->_fan = new Fan();$this->_ac = new AirConditioner();$this->_tv = new Television();}/** * 晚上開電燈 * */public function method1($isOpen =1) {if ($isOpen == 1) {$this->_light->on();$this->_fan->on();$this->_ac->on();$this->_tv->on();}else{$this->_light->off();$this->_fan->off();$this->_ac->off();$this->_tv->off();} }/** * 白天不需要電燈 * */public function method2() {if ($isOpen == 1) {$this->_fan->on();$this->_ac->on();$this->_tv->on();}else{$this->_fan->off();$this->_ac->off();$this->_tv->off();}}} /******************************************子系統類 ************//** * */ class Light{private $_isOpen = 0;public function on() {echo ’Light is open’, ’<br/>’;$this->_isOpen = 1; }public function off() {echo ’Light is off’, ’<br/>’;$this->_isOpen = 0;}} class Fan{private $_isOpen = 0;public function on() {echo ’Fan is open’, ’<br/>’;$this->_isOpen = 1; }public function off() {echo ’Fan is off’, ’<br/>’;$this->_isOpen = 0;}} class AirConditioner{private $_isOpen = 0;public function on() {echo ’AirConditioner is open’, ’<br/>’;$this->_isOpen = 1; }public function off() {echo ’AirConditioner is off’, ’<br/>’;$this->_isOpen = 0;}}class Television{private $_isOpen = 0;public function on() {echo ’Television is open’, ’<br/>’;$this->_isOpen = 1; }public function off() {echo ’Television is off’, ’<br/>’;$this->_isOpen = 0;}}/** * 客戶類 * */class client {static function open() {$f = new SwitchFacade();$f->method1(1);} static function close() {$f = new SwitchFacade();$f->method1(0);}}client::open();11. 與其他相關模式

1)抽象工廠模式:Abstract Factory式可以與Facade模式一起使用以提供一個接口,這一接口可用來以一種子系統獨立的方式創建子系統對象。 Abstract Factory也可以代替Facade模式隱藏那些與平臺相關的類。 2)中介模式:Mediator模式與Facade模式的相似之處是,它抽象了一些已有的類的功能。然而,Mediator的目的是對同事之間的任意通訊進行抽象,通常集中不屬于任何單個對象的功能。 Mediator的同事對象知道中介者并與它通信,而不是直接與其他同類對象通信。相對而言,Facade模式僅對子系統對象的接口進行抽象,從而使它們更容易使用;它并不定義新功能,子系統也不知道Facade的存在。 通常來講,僅需要一個Facade對象,因此Facade對象通常屬于Singleton模式。 3)Adapter模式: 適配器模式是將一個接口通過適配來間接轉換為另一個接口。 外觀模式的話,其主要是提供一個整潔的一致的接口給客戶端。

12. 總結

1)根據“單一職責原則”,在軟件中將一個系統劃分為若干個子系統有利于降低整個系統的復雜性,一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小,而達到該目標的途徑之一就是引入一個外觀對象,它為子系統的訪問提供了一個簡單而單一的入口。

2)外觀模式也是“迪米特法則”的體現,通過引入一個新的外觀類可以降低原有系統的復雜度,外觀類充當了客戶類與子系統類之間的“第三者”,同時降低客戶類與子系統類的耦合度。外觀模式就是實現代碼重構以便達到“迪米特法則”要求的一個強有力的武器。

3)外觀模式要求一個子系統的外部與其內部的通信通過一個統一的外觀對象進行,外觀類將客戶端與子系統的內部復雜性分隔開,使得客戶端只需要與外觀對象打交道,而不需要與子系統內部的很多對象打交道。 4)外觀模式從很大程度上提高了客戶端使用的便捷性,使得客戶端無須關心子系統的工作細節,通過外觀角色即可調用相關功能。 5)不要試圖通過外觀類為子系統增加新行為 ,不要通過繼承一個外觀類在子系統中加入新的行為,這種做法是錯誤的。外觀模式的用意是為子系統提供一個集中化和簡化的溝通渠道,而不是向子系統加入新的行為,新的行為的增加應該通過修改原有子系統類或增加新的子系統類來實現,不能通過外觀類來實現。

13.模式擴展

一個系統有多個外觀類: 在外觀模式中,通常只需要一個外觀類,并且此外觀類只有一個實例,換言之它是一個單例類。在很多情況下為了節約系統資源,一般將外觀類設計為單例類。當然這并不意味著在整個系統里只能有一個外觀類,在一個系統中可以設計多個外觀類,每個外觀類都負責和一些特定的子系統交互,向用戶提供相應的業務功能。 不要試圖通過外觀類為子系統增加新行為:不要通過繼承一個外觀類在子系統中加入新的行為,這種做法是錯誤的。外觀模式的用意是為子系統提供一個集中化和簡化的溝通渠道,而不是向子系統加入新的行為,新的行為的增加應該通過修改原有子系統類或增加新的子系統類來實現,不能通過外觀類來實現。 外觀模式與迪米特法則:外觀模式創造出一個外觀對象,將客戶端所涉及的屬于一個子系統的協作伙伴的數量減到最少,使得客戶端與子系統內部的對象的相互作用被外觀對象所取代。外觀類充當了客戶類與子系統類之間的“第三者”,降低了客戶類與子系統類之間的耦合度,外觀模式就是實現代碼重構以便達到“迪米特法則”要求的一個強有力的武器。 抽象外觀類的引入: 外觀模式最大的缺點在于違背了“開閉原則”,當增加新的子系統或者移除子系統時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題,客戶端針對抽象外觀類進行編程。對于新的業務需求,不修改原有外觀類,而對應增加一個新的具體外觀類,由新的具體外觀類來關聯新的子系統對象,同時通過修改配置文件來達到不修改源代碼并更換外觀類的目的。

UML:

PHP設計模式(九)外觀模式Facade實例詳解【結構型】

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品国产乱码久久久久久图片| 国产亚洲1区2区3区| 国产一区二区不卡在线| 亚洲欧美激情插| 中文字幕亚洲在| 中文字幕一区日韩精品欧美| 久久久精品欧美丰满| 久久一区二区视频| 精品国产凹凸成av人导航| 日韩一二三区不卡| 日韩精品自拍偷拍| 精品av久久707| 国产精品久久久久久亚洲毛片| 中文字幕在线一区| 夜夜嗨av一区二区三区中文字幕 | 日韩一区二区在线看片| 日韩一级完整毛片| 久久久久久一二三区| 国产精品系列在线| 国产三级精品三级在线专区| 久久免费美女视频| 国产亚洲成年网址在线观看| 欧美成人精精品一区二区频| 日韩一区二区三区电影在线观看| 日韩精品一区二区三区蜜臀| 久久久亚洲午夜电影| 日韩精品在线一区| 日韩欧美中文字幕一区| 欧美成人三级在线| 国产亚洲精品超碰| 亚洲欧美日韩国产综合| 艳妇臀荡乳欲伦亚洲一区| 欧美日韩成人一区| 日韩免费性生活视频播放| 国产亚洲自拍一区| 亚洲少妇30p| 婷婷丁香久久五月婷婷| 国产精品综合网| 91在线播放网址| 亚洲人成久久| 一本色道亚洲精品aⅴ| 3d动漫精品啪啪1区2区免费| 日韩一级片网址| 日本一区二区视频在线观看| 亚洲精品日韩一| 日韩国产精品久久久久久亚洲| 国产九色精品成人porny| 成人免费福利片| 欧美日韩三区四区| 国产精品综合色区在线观看| 在线观看国产日韩| 91精品国产免费久久综合| 国产欧美精品一区| 婷婷夜色潮精品综合在线| 国产尤物一区二区在线| 91在线免费看| 一本一道久久综合狠狠老精东影业 | 国产一区二区三区免费不卡| 老司机久久99久久精品播放免费 | 国产精品18久久久久久久网站| 国产99久久久精品| 激情综合久久| 精品视频在线看| 久久亚洲综合av| 亚洲一区二三区| 国产91在线观看丝袜| 99精品视频免费观看视频| 欧美色手机在线观看| 欧美激情资源网| 香蕉久久夜色精品国产使用方法| 成人h动漫精品| 国产亚洲在线| 日韩精品一区二区三区四区视频| 亚洲欧美日韩人成在线播放| 国产一区二区三区免费| 91麻豆高清视频| 一本久久综合亚洲鲁鲁五月天 | 精品久久久久久久久久久久久久久久久| 18欧美乱大交hd1984| 久色婷婷小香蕉久久| 国产精品激情电影| 欧美性大战久久| 亚洲色图视频网| 风间由美一区二区三区在线观看 | 中文字幕av一区二区三区高| 日韩成人精品在线| 国产综合网站| 91精品久久久久久久99蜜桃 | 精品免费国产二区三区| 91精品国产综合久久精品| 国产精品久久久久久久午夜片| 久久黄色级2电影| 亚洲国产精品一区在线观看不卡 | 99国产精品| 91精品福利在线一区二区三区| 亚洲欧美日韩国产成人精品影院| 成人精品小蝌蚪| 色噜噜狠狠成人网p站| 成人欧美一区二区三区小说 | 欧美成人有码| 欧美丰满一区二区免费视频| 一区二区三区久久久| 91网站在线观看视频| 欧美精品v国产精品v日韩精品 | 欧美日韩精品伦理作品在线免费观看 | 国产精品123| 久久综合影音| 国产精品理伦片| 国产91精品在线观看| 欧美在线免费视屏| 国产精品情趣视频| 狠狠狠色丁香婷婷综合激情| 亚洲欧美高清| 最新日韩av在线| 99久久99精品久久久久久| 欧美日韩aaaaaa| 首页国产欧美久久| 在线视频亚洲| 亚洲婷婷综合色高清在线| 不卡一区二区中文字幕| 欧美人与禽zozo性伦| 偷窥国产亚洲免费视频| 伊人成人在线视频| 久久影院午夜论| 国产乱人伦偷精品视频免下载| 色噜噜狠狠色综合中国| 亚洲成人免费观看| 国产一区二区高清| 亚洲丝袜制服诱惑| 伊人久久大香线蕉综合热线 | 国产精品久久久久三级| 91蜜桃免费观看视频| 欧美精品一区二区三区高清aⅴ| 久久99久久99| 玖玖精品视频| 爽爽淫人综合网网站| 国产免费成人| 亚洲国产视频在线| 国产欧美日韩综合一区在线播放| 国产精品无码永久免费888| 欧美精品麻豆| 国产免费成人在线视频| 99热精品一区二区| 久久香蕉国产线看观看99| 成人免费视频视频在线观看免费| 91福利社在线观看| 紧缚捆绑精品一区二区| 欧美日韩在线播放一区| 美女尤物国产一区| 欧美三日本三级三级在线播放| 亚洲国产三级在线| 国产欧美一区二区三区另类精品| 一区二区三区在线不卡| 欧美日韩在线三区| 欧美日韩综合网| 青青草国产成人av片免费| 久久九九影视网| 亚洲伊人观看| 成人激情电影免费在线观看| 亚洲日本一区二区| 欧美日韩精品欧美日韩精品一| 欧美日韩国产精品一卡| 天堂久久一区二区三区| 欧美va亚洲va| 国产精品老牛| av中文字幕一区| 亚洲国产综合在线| 精品久久一区二区三区| 亚洲一区二区在线免费观看| 国产成人福利片| 亚洲图片欧美视频| 久久九九国产精品| 色婷婷精品久久二区二区蜜臀av| 不卡的av中国片| 亚洲电影欧美电影有声小说| 日韩欧美亚洲另类制服综合在线| 在线视频观看日韩| 国产大陆亚洲精品国产| 亚洲黄色录像片| 欧美岛国在线观看| 免费视频一区| 97久久超碰国产精品| 日韩高清不卡在线| 日本一区二区三区在线不卡| 欧美日韩亚洲综合一区| 99视频在线精品国自产拍免费观看| 久久99国产精品麻豆| 亚洲天堂2014| 日韩精品一区二| 玖玖在线精品| 韩日在线一区| 成人免费视频caoporn| 免费在线欧美视频| 亚洲精品精品亚洲| 日韩精品一区二区三区四区 | 国产欧美视频在线观看| 欧美日韩国产高清一区| 一区二区不卡在线视频 午夜欧美不卡'| 成人国产视频在线观看| 免费在线观看精品|