天天看点

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,如需转载请自行联系原作者