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