天天看點

PHP設計模式之擴充卡模式

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>&lt;?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-&gt;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>-&gt;write();</code>

<code>?&gt;</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>-&gt;_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>-&gt;_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>-&gt;_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>-&gt;_errorObject-&gt;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>-&gt;_errorObject-&gt;getErrorNumber();</code>

<code>        </code><code>$line</code><code>.=</code><code>','</code><code>;</code>

<code>        </code><code>$line</code><code>.=</code><code>$this</code><code>-&gt;_errorObject-&gt;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>-&gt;_errorNumber=</code><code>$parts</code><code>[0];</code>

<code>        </code><code>$this</code><code>-&gt;_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>-&gt;_errorNumber;</code>

<code>    </code><code>function</code> <code>getErrorText(){</code>

<code>        </code><code>return</code> <code>$this</code><code>-&gt;_errorText;</code>

本文轉自 3147972 51CTO部落格,原文連結:http://blog.51cto.com/a3147972/1406338,如需轉載請自行聯系原作者