PHP设计模式之适配器模式
index.php
<?php//适配器模式//适配器模式只是将某个对象的接口适配为另一个对象所期望的接口//PHP适配器模式原理,先创建目标实现方法,然后通过适配器类来连接原功能和目标方法,来实现功能的扩展.function__autoload($filename){include_once'class/'.$filename.'.class.php';}/**原来的功能中只有输出错误到控制台,但是后来要求增加一个输出错误到csv中,方便记录,在不更改基类的情况加,通过适配器模式,继承原来得错误类,*并且扩展到适配器中,更改代码,实现输出到csv中.而且也不影响原来输出到控制台中.实现功能的扩展.*///注释代码模仿原来的错误输出功能//$error=newerrorObject("404:NotFound");//$log=newlogToConsole($error);//$log->write();//【主要角色】//目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的//源(Adaptee)角色:需要进行适配的接口//适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类//使用场景//1、你想使用一个已经存在的类,而它的接口不符合你的需求//2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作//3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)//以下为增加新的功能$error=newlogToCSVAdapter("404:NotFound");$log=newlogToCSV($error);$log->write();?>
原始功能类
errorObject.class.php
<?php/**错误基类*/classerrorObject{private$_error;function__construct($error){$this->_error=$error;}functiongetError(){return$this->_error;}}?>
logToConsole.class.php
<?php/**输出到控制台,原始错误执行代码*/classlogToConsole{private$_errorObject;function__construct($o){$this->_errorObject=$o;}functionwrite(){fwrite(STDERR,$this->_errorObject->getError());}}?>
以上就是原来的功能,将指定的错误输出到控制台显示出来.现在的需求是扩展一个写入CSV文件中得功能.在不改变原来的功能的情况下.扩展功能
logToCSV.class.php
<?php/**输出错误到csv文件*/classlogToCSV{constCSV_LOCATION='log.csv';private$_errorObject;function__construct($o){$this->_errorObject=$o;}functionwrite(){$line=$this->_errorObject->getErrorNumber();$line.=',';$line.=$this->_errorObject->getErrorText();$line.="\n";file_put_contents(self::CSV_LOCATION,$line,FILE_APPEND);}}?>
接下来要做的就是将新得logToCSV方法和原来写得errorObject连接起来使用,两种方法,可以更改原来得errorObject类,或者是使用适配器模式,新增一个基类,来重写原来的功能
logToCSVAdapter.class.php
<?php/**扩展错误类,并且增加新的功能来支持logToCSV类中的方法*/classlogToCSVAdapterextendserrorObject{private$_errorNumber,$_errorText;function__construct($error){//继承父类的初始化.并且增加新的方法.parent::__construct($error);$parts=explode(":",$error);$this->_errorNumber=$parts[0];$this->_errorText=$parts[1];}functiongetErrorNumber(){return$this->_errorNumber;}functiongetErrorText(){return$this->_errorText;}}?>
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。