學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)門(mén)面模式(Facade)
一、意圖
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層次的接口,使得子系統(tǒng)更加容易使用【GOF95】
外部與子系統(tǒng)的通信是通過(guò)一個(gè)門(mén)面(Facade)對(duì)象進(jìn)行。
二、門(mén)面模式結(jié)構(gòu)圖

三、門(mén)面模式中主要角色
門(mén)面(Facade)角色:
此角色將被客戶端調(diào)用
知道哪些子系統(tǒng)負(fù)責(zé)處理請(qǐng)求
將用戶的請(qǐng)求指派給適當(dāng)?shù)淖酉到y(tǒng)
子系統(tǒng)(subsystem)角色:
實(shí)現(xiàn)子系統(tǒng)的功能
處理由Facade對(duì)象指派的任務(wù)
沒(méi)有Facade的相關(guān)信息,可以被客戶端直接調(diào)用
可以同時(shí)有一個(gè)或多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)都不是一個(gè)單獨(dú)的類(lèi),而一個(gè)類(lèi)的集合。每個(gè)子系統(tǒng)都可以被客戶端直接調(diào)用,或者被門(mén)面角色調(diào)用。子系統(tǒng)并知道門(mén)面模式的存在,對(duì)于子系統(tǒng)而言,門(mén)面僅僅是另一個(gè)客戶端。
四、門(mén)面模式的優(yōu)點(diǎn)
1、它對(duì)客戶屏蔽了子系統(tǒng)組件,因而減少了客戶處理的對(duì)象的數(shù)目并使得子系統(tǒng)使用起來(lái)更加方便
2、實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系
3、如果應(yīng)用需要,它并不限制它們使用子系統(tǒng)類(lèi)。因此可以在系統(tǒng)易用性與能用性之間加以選擇
五、門(mén)面模式適用場(chǎng)景
1、為一些復(fù)雜的子系統(tǒng)提供一組接口
2、提高子系統(tǒng)的獨(dú)立性
3、在層次化結(jié)構(gòu)中,可以使用門(mén)面模式定義系統(tǒng)的每一層的接口
六、門(mén)面模式與其它模式
抽象工廠模式(abstract factory模式):Abstract Factory模式可以與Facade模式一起使用以提供一個(gè)接口,這一接口可用來(lái)以一種子系統(tǒng)獨(dú)立的方式創(chuàng)建子系統(tǒng)對(duì)象。Abstract Factory模式也可以代替Facade模式隱藏那些與平臺(tái)相關(guān)的類(lèi)
調(diào)停者模式:Mediator模式與Facade模式的相似之處是,它抽象了一些已有類(lèi)的功能。然而,Mediator目的是對(duì)同事之間的任意通訊進(jìn)行抽象,通常集中不屬于任何單個(gè)對(duì)象的功能。Mediator的同事對(duì)象知道中介者并與它通信,而不是直接與其他同類(lèi)對(duì)象通信。相對(duì)而言,F(xiàn)acade模式僅對(duì)子系統(tǒng)對(duì)象的接口進(jìn)行抽象,從而使它們更容易使用;它并定義不功能,子系統(tǒng)也不知道facade的存在
單例模式(singleton模式):一般來(lái)說(shuō),僅需要一個(gè)Facade對(duì)象,因此Facade對(duì)象通常屬于Singleton對(duì)象。
七、門(mén)面模式PHP示例
<?php
class Camera {
/**
* 打開(kāi)錄像機(jī)
*/
public function turnOn() {
echo 'Turning on the camera.<br />';
}
/**
* 關(guān)閉錄像機(jī)
*/
public function turnOff() {
echo 'Turning off the camera.<br />';
}
/**
* 轉(zhuǎn)到錄像機(jī)
* @param <type> $degrees
*/
public function rotate($degrees) {
echo 'rotating the camera by ', $degrees, ' degrees.<br />';
}
}
class Light {
/**
* 開(kāi)燈
*/
public function turnOn() {
echo 'Turning on the light.<br />';
}
/**
* 關(guān)燈
*/
public function turnOff() {
echo 'Turning off the light.<br />';
}
/**
* 換燈泡
*/
public function changeBulb() {
echo 'changing the light-bulb.<br />';
}
}
class Sensor {
/**
* 啟動(dòng)感應(yīng)器
*/
public function activate() {
echo 'Activating the sensor.<br />';
}
/**
* 關(guān)閉感應(yīng)器
*/
public function deactivate() {
echo 'Deactivating the sensor.<br />';
}
/**
* 觸發(fā)感應(yīng)器
*/
public function trigger() {
echo 'The sensor has been trigged.<br />';
}
}
class Alarm {
/**
* 啟動(dòng)警報(bào)器
*/
public function activate() {
echo 'Activating the alarm.<br />';
}
/**
* 關(guān)閉警報(bào)器
*/
public function deactivate() {
echo 'Deactivating the alarm.<br />';
}
/**
* 拉響警報(bào)器
*/
public function ring() {
echo 'Ring the alarm.<br />';
}
/**
* 停掉警報(bào)器
*/
public function stopRing() {
echo 'Stop the alarm.<br />';
}
}
/**
* 門(mén)面類(lèi)
*/
class SecurityFacade {
/* 錄像機(jī) */
private $_camera1, $_camera2;
/* 燈 */
private $_light1, $_light2, $_light3;
/* 感應(yīng)器 */
private $_sensor;
/* 警報(bào)器 */
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();
?>
以上就是使用php實(shí)現(xiàn)門(mén)面模式的代碼,還有一些關(guān)于門(mén)面模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
PHP實(shí)現(xiàn)駝峰樣式字符串(首字母大寫(xiě))轉(zhuǎn)換成下劃線樣式字符串的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)駝峰樣式字符串(首字母大寫(xiě))轉(zhuǎn)換成下劃線樣式字符串的方法,涉及php正則替換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
淺析php數(shù)據(jù)類(lèi)型轉(zhuǎn)換
這篇文章主要介紹了php數(shù)據(jù)類(lèi)型轉(zhuǎn)換,有需要的朋友可以參考一下2014-01-01
PHP內(nèi)部實(shí)現(xiàn)打亂字符串順序函數(shù)str_shuffle的方法
這篇文章主要給大家介紹了關(guān)于PHP內(nèi)部實(shí)現(xiàn)打亂字符串順序函數(shù)str_shuffle的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
php實(shí)現(xiàn)在服務(wù)器端調(diào)整圖片大小的方法
這篇文章主要介紹了php實(shí)現(xiàn)在服務(wù)器端調(diào)整圖片大小的方法,實(shí)例分析了imageResizer與loadimage操作圖片的相關(guān)技巧,需要的朋友可以參考下2015-06-06
highchart數(shù)據(jù)源縱軸json內(nèi)的值必須是int(詳解)
下面小編就為大家?guī)?lái)一篇highchart數(shù)據(jù)源縱軸json內(nèi)的值必須是int(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
CakePHP去除默認(rèn)顯示的標(biāo)題及圖標(biāo)的方法
使用cakephp框架時(shí),在生成的html頁(yè)面里,總是有cakephp的標(biāo)志(上面有大大的標(biāo)題CakePHP Rapid Development,下面還有一個(gè)cakephp的圖標(biāo)),雖然是cakephp的東西,但放到自己的項(xiàng)目中看起來(lái)總是不順眼。2008-10-10
PHP Laravel框架異步執(zhí)行的實(shí)現(xiàn)詳解
Laravel是一套簡(jiǎn)潔、優(yōu)雅的PHP Web開(kāi)發(fā)框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來(lái);它可以幫你構(gòu)建一個(gè)完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡(jiǎn)潔、富于表達(dá)力2022-07-07

