php設(shè)計(jì)模式之裝飾模式應(yīng)用案例詳解
本文實(shí)例講述了php設(shè)計(jì)模式之裝飾模式。分享給大家供大家參考,具體如下:
介紹
- 裝飾者模式(Decorator Pattern)允許你向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。 這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝。
- 這種模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi),并在保持類(lèi)方法簽名完整性的前提下,提供了額外的功能。
主要角色
- 抽象構(gòu)件(Component)角色:定義一個(gè)獨(dú)享接口,以規(guī)范準(zhǔn)備接收附加職責(zé)的對(duì)象,從而可以給這些對(duì)象動(dòng)態(tài)的添加職責(zé)。
- 具體構(gòu)件(Concrete Component)角色:定義一個(gè)將要接收附加職責(zé)的類(lèi)。
- 裝飾(Decorator)角色:持有一個(gè)指向Component對(duì)象的指針,并定義一個(gè)與Component接口一致的接口。
- 具體裝飾(Concrete Decorator)角色:負(fù)責(zé)給構(gòu)件對(duì)象增加附加的職責(zé)。
下面是使用裝飾模式的一個(gè)簡(jiǎn)單實(shí)現(xiàn):
class RequestHelper{}
abstract class ProcessRequest{
abstract function process(RequestHelper $req);
}
class MainProcess extends ProcessRequest{
function process(RequestHelper $req)
{
print __CLASS__.": doing something useful with request\n";
}
}
abstract class DecorateProcess extends ProcessRequest{
protected $processRequest;
function __construct(ProcessRequest $pr)
{
$this->processRequest = $pr;
}
}
和之前一樣,我們定義了一個(gè)抽象基類(lèi)(ProcessRequest)、一個(gè)具體的組件(MainProcess)和一個(gè)抽象裝飾類(lèi)(DecorateProcess)。 MainProcess::process()方法僅僅報(bào)告方法被調(diào)用,并沒(méi)有其他功能。DecorateProcess為他的子類(lèi)保存了一個(gè)ProcessRequest對(duì)象。下面是一些簡(jiǎn)單的具體裝飾類(lèi):
class LogRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": logging request\n";
$this->processRequest->process($req);
}
}
class AuthenticateRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": authenticating request\n";
$this->processRequest->process($req);
}
}
class StructureRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": structuring request\n";
$this->processRequest->process($req);
}
}
裝飾類(lèi)的每一個(gè)process()方法在調(diào)用引用的processRequest對(duì)象的Process()方法前輸出一條信息。
現(xiàn)在我們可以在運(yùn)行時(shí)合并這些類(lèi)的對(duì)象,創(chuàng)建過(guò)濾器來(lái)對(duì)每一個(gè)請(qǐng)求按不同的順序執(zhí)行不同操作。下面的代碼將所有具體類(lèi)的對(duì)象組合成為一個(gè)過(guò)濾器:
$process = new AuthenticateRequest(new StructureRequest(
new LogRequest(
new MainProcess()
)));
$process->process(new RequestHelper());
執(zhí)行代碼會(huì)得到下面的輸出結(jié)果:
Authenticate
Request: authenticating request
StructureRequest: structuring request
LogRequest: logging request
MainProcess: doing something useful with request
優(yōu)點(diǎn):
裝飾類(lèi)和被裝飾類(lèi)可以獨(dú)立發(fā)展,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)代替模式,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能。
缺點(diǎn):
多層裝飾比較負(fù)責(zé)。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- php設(shè)計(jì)模式 Adapter(適配器模式)
- PHP設(shè)計(jì)模式之適配器模式代碼實(shí)例
- php適配器模式介紹
- 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)適配器模式
- PHP設(shè)計(jì)模式之適配器模式原理與用法分析
- PHP設(shè)計(jì)模式之適配器模式定義與用法詳解
- php設(shè)計(jì)模式之工廠模式用法經(jīng)典實(shí)例分析
- php設(shè)計(jì)模式之單例模式用法經(jīng)典示例分析
- php設(shè)計(jì)模式之觀察者模式定義與用法經(jīng)典示例
- php設(shè)計(jì)模式之職責(zé)鏈模式定義與用法經(jīng)典示例
- php設(shè)計(jì)模式之策略模式應(yīng)用案例詳解
- php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
相關(guān)文章
刪除html標(biāo)簽得到純文本可處理嵌套的標(biāo)簽
這篇文章主要介紹了通過(guò)刪除html標(biāo)簽得到的純文本可處理嵌套的標(biāo)簽,需要的朋友可以參考下2014-04-04
php中switch與ifelse的效率區(qū)別及適用情況分析
這篇文章主要介紹了php中switch與ifelse的效率區(qū)別及適用情況分析,以實(shí)例的形式分析了針對(duì)變量與常量的情況下switch與ifelse的效率區(qū)別,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
PHP內(nèi)置過(guò)濾器FILTER使用實(shí)例
這篇文章主要介紹了PHP內(nèi)置過(guò)濾器FILTER使用實(shí)例,列舉了驗(yàn)證功能和糾錯(cuò)功能的代碼例子來(lái)講解如何使用FILTER,需要的朋友可以參考下2014-06-06
PHP實(shí)現(xiàn)C#山寨ArrayList的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)C#山寨ArrayList的方法,通過(guò)一個(gè)php自定義類(lèi)模擬實(shí)現(xiàn)C#中ArrayList的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
PHP直接修改表內(nèi)容DataGrid功能實(shí)現(xiàn)代碼
最近想做一個(gè)通過(guò)PHP實(shí)現(xiàn)DataGrid功能的東西,這樣可以直接修改數(shù)據(jù)庫(kù)中表的內(nèi)容,而不用開(kāi)發(fā)【新增數(shù)據(jù)頁(yè)面】和【編輯頁(yè)面】,本篇首先介紹基于MySQL的使用方法,再簡(jiǎn)單介紹對(duì)于Oracle連接(基于sqlrelay)的二次開(kāi)發(fā)。2015-09-09
PHP中經(jīng)緯度坐標(biāo)相關(guān)計(jì)算方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了PHP中經(jīng)緯度坐標(biāo)相關(guān)計(jì)算方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
php+ajax登錄跳轉(zhuǎn)登錄實(shí)現(xiàn)思路
這篇文章主要介紹了php+ajax登錄跳轉(zhuǎn)登錄實(shí)現(xiàn)思路,非常的簡(jiǎn)單,有需要的小伙伴可以參考下2016-07-07

