适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口.
UML图:
说明:
1.MyObject有一个methodA()的公共方法,OrigianConsumer获取MyObject的实例,并在执行doSomething()方法期间,调用methodA()
2.引入NewConsumer,这个类期望在执行doSomething()方法期间,调用MyObject实例的另一个公共方法methodB()
3.通过扩展MyObject,创建一个ObjectAdaper类,像NewConsumer期望的那样,新创建的ObjectAdaper会提供methodB的公共方法,在这个简单的示例中,所有的methodB都会调用methodA
场景说明和代码示例:
项目开始我们有个错误类,简单的返回产生的错误!
class ErrorObject{ ???private $error; ???public function __construct($error) ???{ ???????$this->error = $error; ???} ???public function getError() ???{ ???????return $this->error; ???}}// 日志类class LogError{ ???private $errObject; ???public function __construct($errOgb) ???{ ???????$this->errObject = $errOgb; ???} ???public function write() ???{ ???????error_log($this->errObject->getError(), 0); ???}}
在最开始我们是这样子使用的:
$error = new ErrorObject(‘404: not found‘);$log = new LogError($error);$log->write();
后来管理员觉得这样子不好,应该将日志写入一个csv,便于监控软件来生成日志监控图.监控软件需要第一列是数值错误代码,第二列是错误信息.但之前ErrorObject还需要为其他类提供服务.
这时我们就要适配器来解决:
class ErrorAdapter ?extends ErrorObject{ ???private $errorNumber, $errorText; ???public function __construct($error) ???{ ???????parent::__construct($error); ???????$parts = explode(‘:‘, $error); ???????$this->errorNumber = $parts[0]; ???????$this->errorText = $parts[1]; ???} ???public function getErrorNumber() ???{ ???????return $this->errorNumber; ???} ???public function getErrorText() ???{ ???????return $this->errorText; ???}}
新的日志记录类:
class LogToCsv{ ???const CSV_LOCATION = ‘log.csv‘; ???private $errorObject; ???public function __construct(ErrorAdapter $errObject) ???{ ???????$this->errorObject = $errObject; ???} ???public function write() ???{ ???????$line = $this->errorObject->getErrorNumber(); ???????$line .= ‘,‘; ???????$line .= $this->errorObject->getErrorText(); ???????$line .= "\n"; ???????file_get_contents(self::CSV_LOCATION, $line); ???}}
// 新的调用$err = new ErrorAdapter(‘501:bad action‘);$log = new LogToCsv($err);$log->write();
LogToCsv期望从ErrorObject中获取到错误信息的数字标识和错误文本,但因为不便于对ErrorObject进行修改,我们用一个适配器继承了ErrorObject,并提供了LogToCsv期望的两个方法来满足需求.
php设计模式之适配器模式
原文地址:http://www.cnblogs.com/itfenqing/p/7712316.html