引言php
組合模式幫組咱們聚合組件,裝飾模式則使用相似節後來幫組咱們改變具體組件的功能this
問題spa
將全部功能簡歷在集成體系上會致使系統中的類「爆炸式」增多,當你嘗試對集成書上不一樣的分支作想死的修改是,代碼可能會產生重複ssr
uml圖日誌
代碼實現code
<?php /* decoration.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<br>"; } } //抽象裝飾類 abstract class DecorateProcess extends ProcessRequest{//繼承 protected $processrequest; function __construct(ProcessRequest $pr){//組合 $this->processrequest = $pr; } } //日誌裝飾類 class LogRequest extends DecorateProcess{ function process(Requesthelper $req){ print __CLASS__.": logging request<br>"; $this->processrequest->process($req);//委託 } } //認證裝飾類 class AuthenticateRequest extends DecorateProcess{ function process(Requesthelper $req){ print __CLASS__.": authenticating request<br>"; $this->processrequest->process($req); } } //認證裝飾類 class StructreRequest extends DecorateProcess{ function process(Requesthelper $req){ print __CLASS__.": structring request<br>"; $this->processrequest->process($req); } } //client $process = new AuthenticateRequest(new StructreRequest(new LogRequest(new MainProcess()))); $process ->process(new Requesthelper()); ?>
效果對象
組合和繼承一般都是同時使用的,所以logrequest是繼承自processrequest,可是卻保險爲對另一個processrequest對象的封裝blog
由於修飾對象做爲子對象的包裝,因此保持基類中的方法儘量少是很重要的繼承