php设计模式之适配器模式
2021-05-20 04:27
标签:日志记录 执行 技术 func 服务 示例 技术分享 const log 说明: 项目开始我们有个错误类,简单的返回产生的错误! 在最开始我们是这样子使用的: 后来管理员觉得这样子不好,应该将日志写入一个csv,便于监控软件来生成日志监控图.监控软件需要第一列是数值错误代码,第二列是错误信息.但之前ErrorObject还需要为其他类提供服务. 这时我们就要适配器来解决: 新的日志记录类: LogToCsv期望从ErrorObject中获取到错误信息的数字标识和错误文本,但因为不便于对ErrorObject进行修改,我们用一个适配器继承了ErrorObject,并提供了LogToCsv期望的两个方法来满足需求. php设计模式之适配器模式 标签:日志记录 执行 技术 func 服务 示例 技术分享 const log 原文地址:http://www.cnblogs.com/itfenqing/p/7712316.html适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口.
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();
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();