本文實例講述了php設計模式之裝飾模式。分享給大家供大家參考,具體如下:
介紹
主要角色
下面是使用裝飾模式的一個簡單實現:
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; }}
和之前一樣,我們定義了一個抽象基類(ProcessRequest)、一個具體的組件(MainProcess)和一個抽象裝飾類(DecorateProcess)。 MainProcess::process()方法僅僅報告方法被調用,并沒有其他功能。DecorateProcess為他的子類保存了一個ProcessRequest對象。下面是一些簡單的具體裝飾類:
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); }}
裝飾類的每一個process()方法在調用引用的processRequest對象的Process()方法前輸出一條信息。
現在我們可以在運行時合并這些類的對象,創建過濾器來對每一個請求按不同的順序執行不同操作。下面的代碼將所有具體類的對象組合成為一個過濾器:
$process = new AuthenticateRequest(new StructureRequest( new LogRequest( new MainProcess() )));$process->process(new RequestHelper());
執行代碼會得到下面的輸出結果:
Authenticate
Request: authenticating request
StructureRequest: structuring request
LogRequest: logging request
MainProcess: doing something useful with request
優點:
裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個代替模式,裝飾模式可以動態擴展一個實現類的功能。
缺點:
多層裝飾比較負責。
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選