在应用程序中,你也许会使用一个文档的代码库,然而,我们常常要添加新的功能,这些功能要求使用不同的方式使用现有的对象。可能新功能只是需要一个不同的名字,也可能是新功能需要与原有的对象稍有不同的行为。
针对上述问题,采用适配器模式是个很好的解决方案。使用适配器模式创建另一个对象,这个Adapter对象充当了原始应用与新功能之间的中介。适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口。
代码示例:
class errorObject{ private $_error; public function __construct($error){ $this->_error = $error; } public function getError(){ return $this->_error; } } class logToConsole{ private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ fwrite(STDERR, $this->_errorObject->getError()); } } $error = new errorObject("404:Not Found"); $log = new logToConsole($error); $log->write();
class logToCSV{ const CSV_LOCATION = "log.csv"; private $_errorObject; public function __construct($errorObject){ $this->_errorObject = $errorObject; } public function write(){ $line = $this->_errorObject->getErrorNumber(); $line .= ','; $line .= $this->_errorObject->getErrorText(); $line .= '\n'; file_put_contents(self::CSV_LOCATION, $line, FILE_APPEND); } }针对这个问题,我们可以采用下面两种解决方案:
● 创建现有代码库的errorObject类;
● 创建一个Adapter类;
考虑到保持这些公共接口标准性的需求,因此创建一个Adapter对象是最佳的解决方案。
新创建的适配器对象中必须存在现有errorObject的功能性,而且,getErrorNumber()和getErrorText()方法必须有效。
class logToCSVAdapter extends errorObject{ private $_errorNumber, $_errorText; public function __construct($error){ parent::__construct($error); $parts = explode(':', $this->getError()); $this->_errorNumber = $parts[0]; $this->_errorText = $parts[1]; } public function getErrorNumber(){ return $this->_errorNumber; } public function getErrorText(){ return $this->_errorText; } } $error = new logToCSVAdapter("404:Not Found"); $log = new logToCSV($error); $log->write();
适配器模式一般使用场景:
● 数据库驱动(可查看各框架的驱动部分源码)
● webservices(在多个不同的webservices中,使用适配器)
以上就介绍了PHP设计模式——适配器模式Adapter,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。