PHP設計模式筆記:使用PHP實現門面模式
【意圖】
爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層次的接口,使得子系統更加容易使用【GOF95】
外部與子系統的通信是通過一個門面(Facade)對象進行。
【門面模式結構圖】
【門面模式中主要角色】
門面(Facade)角色:
此角色將被客戶端調用
知道哪些子系統負責處理請求
將用戶的請求指派給適當的子系統
子系統(subsystem)角色:
實現子系統的功能
處理由Facade對象指派的任務
沒有Facade的相關信息,可以被客戶端直接調用
可以同時有一個或多個子系統,每個子系統都不是一個單獨的類,而一個類的集合。每個子系統都可以被客戶端直接調用,或者被門面角色調用。子系統並知道門面模式的存在,對於子系統而言,門面僅僅是另一個客戶端。
【門面模式的優點】
1、它對客戶屏蔽了子系統組件,因而減少了客戶處理的對象的數目並使得子系統使用起來更加方便
2、實現了子系統與客戶之間的松耦合關係
3、如果應用需要,它並不限制它們使用子系統類。因此可以在系統易用性與能用性之間加以選擇
【門面模式適用場景】
1、爲一些複雜的子系統提供一組接口
2、提高子系統的獨立性
3、在層次化結構中,可以使用門面模式定義系統的每一層的接口
【門面模式與其它模式】
抽象工廠模式:Abstract Factory模式可以與Facade模式一起使用以提供一個接口,這一接口可用來以一種子系統獨立的方式創建子系統對象。Abstract Factory模式也可以代替Facade模式隱藏那些與平臺相關的類
調停者模式:Mediator模式與Facade模式的相似之處是,它抽象了一些已有類的功能。然而,Mediator目的是對同事之間的任意通訊進行抽象,通常集中不屬於任何單個對象的功能。Mediator的同事對象知道中介者並與它通信,而不是直接與其他同類對象通信。相對而言,Facade模式僅對子系統對象的接口進行抽象,從而使它們更容易使用;它並定義不功能,子系統也不知道facade的存在
單例模式:一般來說,僅需要一個Facade對象,因此Facade對象通常屬於Singleton對象。
【門面模式PHP示例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
<?php /** * 門面模式 2010-06-12 sz * 《Java與模式》上門面模式示例的PHP版本 * @author phppan.p#gmail.com http://www.phppan.com * 哥學社成員(http://www.blog-brother.com/) * @package design pattern */ class Camera { /** * 打開錄像機 */ public function turnOn() { echo 'Turning on the camera.<br />'; } /** * 關閉錄像機 */ public function turnOff() { echo 'Turning off the camera.<br />'; } /** * 轉到錄像機 * @param <type> $degrees */ public function rotate($degrees) { echo 'rotating the camera by ', $degrees, ' degrees.<br />'; } } class Light { /** * 開燈 */ public function turnOn() { echo 'Turning on the light.<br />'; } /** * 關燈 */ public function turnOff() { echo 'Turning off the light.<br />'; } /** * 換燈泡 */ public function changeBulb() { echo 'changing the light-bulb.<br />'; } } class Sensor { /** * 啓動感應器 */ public function activate() { echo 'Activating the sensor.<br />'; } /** * 關閉感應器 */ public function deactivate() { echo 'Deactivating the sensor.<br />'; } /** * 觸發感應器 */ public function trigger() { echo 'The sensor has been trigged.<br />'; } } class Alarm { /** * 啓動警報器 */ public function activate() { echo 'Activating the alarm.<br />'; } /** * 關閉警報器 */ public function deactivate() { echo 'Deactivating the alarm.<br />'; } /** * 拉響警報器 */ public function ring() { echo 'Ring the alarm.<br />'; } /** * 停掉警報器 */ public function stopRing() { echo 'Stop the alarm.<br />'; } } /** * 門面類 */ class SecurityFacade { /* 錄像機 */ private $_camera1, $_camera2; /* 燈 */ private $_light1, $_light2, $_light3; /* 感應器 */ private $_sensor; /* 警報器 */ private $_alarm; public function __construct() { $this->_camera1 = new Camera(); $this->_camera2 = new Camera(); $this->_light1 = new Light(); $this->_light2 = new Light(); $this->_light3 = new Light(); $this->_sensor = new Sensor(); $this->_alarm = new Alarm(); } public function activate() { $this->_camera1->turnOn(); $this->_camera2->turnOn(); $this->_light1->turnOn(); $this->_light2->turnOn(); $this->_light3->turnOn(); $this->_sensor->activate(); $this->_alarm->activate(); } public function deactivate() { $this->_camera1->turnOff(); $this->_camera2->turnOff(); $this->_light1->turnOff(); $this->_light2->turnOff(); $this->_light3->turnOff(); $this->_sensor->deactivate(); $this->_alarm->deactivate(); } } /** * 客戶端 */ class Client { private static $_security; /** * Main program. */ public static function main() { self::$_security = new SecurityFacade(); self::$_security->activate(); } } Client::main(); ?> |