index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code><?php</code>
<code>//擴充卡模式</code>
<code>//擴充卡模式隻是将某個對象的接口适配為另一個對象所期望的接口</code>
<code>//PHP擴充卡模式原理,先建立目标實作方法,然後通過擴充卡類來連接配接原功能和目标方法,來實作功能的擴充.</code>
<code>function</code> <code>__autoload(</code><code>$filename</code><code>){</code>
<code> </code><code>include_once</code> <code>'class/'</code><code>.</code><code>$filename</code><code>.</code><code>'.class.php'</code><code>;</code>
<code>}</code>
<code>/*</code>
<code> </code><code>* 原來的功能中隻有輸出錯誤到控制台,但是後來要求增加一個輸出錯誤到csv中,友善記錄,在不更改基類的情況加,通過擴充卡模式,繼承原來得錯誤類,</code>
<code> </code><code>* 并且擴充到擴充卡中,更改代碼,實作輸出到csv中.而且也不影響原來輸出到控制台中.實作功能的擴充.</code>
<code> </code><code>*/</code>
<code>//注釋代碼模仿原來的錯誤輸出功能</code>
<code>//$error=new errorObject("404:Not Found");</code>
<code>// $log=new logToConsole($error);</code>
<code>// $log->write();</code>
<code>//【主要角色】</code>
<code>//目标(Target)角色:定義用戶端使用的與特定領域相關的接口,這也就是我們所期待得到的</code>
<code>//源(Adaptee)角色:需要進行适配的接口</code>
<code>//擴充卡(Adapter)角色:對Adaptee的接口與Target接口進行适配;擴充卡是本模式的核心,擴充卡把源接口轉換成目标接口,此角色為具體類</code>
<code>//使用場景</code>
<code>//1、你想使用一個已經存在的類,而它的接口不符合你的需求</code>
<code>//2、你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類協同工作</code>
<code>//3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以比對它們的接口。對象擴充卡可以适配它的父類接口(僅限于對象擴充卡)</code>
<code>//以下為增加新的功能</code>
<code>$error</code><code>=</code><code>new</code> <code>logToCSVAdapter(</code><code>"404:Not Found"</code><code>);</code>
<code>$log</code><code>=</code><code>new</code> <code>logToCSV(</code><code>$error</code><code>);</code>
<code>$log</code><code>->write();</code>
<code>?></code>
原始功能類
errorObject.class.php
<code> </code><code>* 錯誤基類</code>
<code>class</code> <code>errorObject{</code>
<code> </code><code>private</code> <code>$_error</code><code>;</code>
<code> </code><code>function</code> <code>__construct(</code><code>$error</code><code>){</code>
<code> </code><code>$this</code><code>->_error=</code><code>$error</code><code>;</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>function</code> <code>getError(){</code>
<code> </code><code>return</code> <code>$this</code><code>->_error;</code>
logToConsole.class.php
<code> </code><code>* 輸出到控制台,原始錯誤執行代碼</code>
<code>class</code> <code>logToConsole{</code>
<code> </code><code>private</code> <code>$_errorObject</code><code>;</code>
<code> </code><code>function</code> <code>__construct(</code><code>$o</code><code>){</code>
<code> </code><code>$this</code><code>->_errorObject=</code><code>$o</code><code>;</code>
<code> </code>
<code> </code><code>function</code> <code>write(){</code>
<code> </code><code>fwrite(STDERR, </code><code>$this</code><code>->_errorObject->getError());</code>
以上就是原來的功能,将指定的錯誤輸出到控制台顯示出來.現在的需求是擴充一個寫入CSV檔案中得功能.在不改變原來的功能的情況下.擴充功能
logToCSV.class.php
<code> </code><code>* 輸出錯誤到csv檔案</code>
<code>class</code> <code>logToCSV{</code>
<code> </code><code>const</code> <code>CSV_LOCATION=</code><code>'log.csv'</code><code>;</code>
<code> </code>
<code> </code><code>$line</code><code>=</code><code>$this</code><code>->_errorObject->getErrorNumber();</code>
<code> </code><code>$line</code><code>.=</code><code>','</code><code>;</code>
<code> </code><code>$line</code><code>.=</code><code>$this</code><code>->_errorObject->getErrorText();</code>
<code> </code><code>$line</code><code>.=</code><code>"\n"</code><code>;</code>
<code> </code><code>file_put_contents</code><code>(self::CSV_LOCATION, </code><code>$line</code><code>,FILE_APPEND);</code>
接下來要做的就是将新得logToCSV方法和原來寫得errorObject連接配接起來使用,兩種方法,可以更改原來得errorObject類,或者是使用擴充卡模式,新增一個基類,來重寫原來的功能
logToCSVAdapter.class.php
<code> </code><code>* 擴充錯誤類,并且增加新的功能來支援logToCSV類中的方法</code>
<code>class</code> <code>logToCSVAdapter </code><code>extends</code> <code>errorObject{</code>
<code> </code><code>private</code> <code>$_errorNumber</code><code>,</code><code>$_errorText</code><code>;</code>
<code> </code>
<code> </code><code>//繼承父類的初始化.并且增加新的方法.</code>
<code> </code><code>parent::__construct(</code><code>$error</code><code>);</code>
<code> </code><code>$parts</code><code>=</code><code>explode</code><code>(</code><code>":"</code><code>, </code><code>$error</code><code>);</code>
<code> </code><code>$this</code><code>->_errorNumber=</code><code>$parts</code><code>[0];</code>
<code> </code><code>$this</code><code>->_errorText=</code><code>$parts</code><code>[1];</code>
<code> </code><code>function</code> <code>getErrorNumber(){</code>
<code> </code><code>return</code> <code>$this</code><code>->_errorNumber;</code>
<code> </code><code>function</code> <code>getErrorText(){</code>
<code> </code><code>return</code> <code>$this</code><code>->_errorText;</code>
本文轉自 3147972 51CTO部落格,原文連結:http://blog.51cto.com/a3147972/1406338,如需轉載請自行聯系原作者