讓面向對象編程更加靈活的的模式-----裝飾模式

引言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

由於修飾對象做爲子對象的包裝,因此保持基類中的方法儘量少是很重要的繼承

相關文章
相關標籤/搜索