PHP設計模式筆記:使用PHP實現門面模式

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();
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章