PHP设计模式之适配器模式
index.php
<?php //适配器模式 //适配器模式只是将某个对象的接口适配为另一个对象所期望的接口 //PHP适配器模式原理,先创建目标实现方法,然后通过适配器类来连接原功能和目标方法,来实现功能的扩展. function __autoload($filename){ include_once 'class/'.$filename.'.class.php'; } /* * 原来的功能中只有输出错误到控制台,但是后来要求增加一个输出错误到csv中,方便记录,在不更改基类的情况加,通过适配器模式,继承原来得错误类, * 并且扩展到适配器中,更改代码,实现输出到csv中.而且也不影响原来输出到控制台中.实现功能的扩展. */ //注释代码模仿原来的错误输出功能 //$error=new errorObject("404:Not Found"); // $log=new logToConsole($error); // $log->write(); //【主要角色】 //目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的 //源(Adaptee)角色:需要进行适配的接口 //适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类 //使用场景 //1、你想使用一个已经存在的类,而它的接口不符合你的需求 //2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作 //3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器) //以下为增加新的功能 $error=new logToCSVAdapter("404:Not Found"); $log=new logToCSV($error); $log->write(); ?>
原始功能类
errorObject.class.php
<?php /* * 错误基类 */ class errorObject{ private $_error; function __construct($error){ $this->_error=$error; } function getError(){ return $this->_error; } } ?>
logToConsole.class.php
<?php /* * 输出到控制台,原始错误执行代码 */ class logToConsole{ private $_errorObject; function __construct($o){ $this->_errorObject=$o; } function write(){ fwrite(STDERR, $this->_errorObject->getError()); } } ?>
以上就是原来的功能,将指定的错误输出到控制台显示出来.现在的需求是扩展一个写入CSV文件中得功能.在不改变原来的功能的情况下.扩展功能
logToCSV.class.php
<?php /* * 输出错误到csv文件 */ class logToCSV{ const CSV_LOCATION='log.csv'; private $_errorObject; function __construct($o){ $this->_errorObject=$o; } function write(){ $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类中的方法 */ class logToCSVAdapter extends errorObject{ private $_errorNumber,$_errorText; function __construct($error){ //继承父类的初始化.并且增加新的方法. parent::__construct($error); $parts=explode(":", $error); $this->_errorNumber=$parts[0]; $this->_errorText=$parts[1]; } function getErrorNumber(){ return $this->_errorNumber; } function getErrorText(){ return $this->_errorText; } } ?>
© 版权声明
文章版权归作者所有,未经允许请勿转载。