热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php设计模式之适配器模式

适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口.UML图:说明:1.MyObject有一个methodA()的公共方法,OrigianConsumer获取MyObject的实例,并在执

适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口.

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中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • 装饰模式(Deocrator)     动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。    所谓装饰,就是一些对象给主题 ... [详细]
  • 获得要素图层通过UID获取1<summary>2获得要素图层UID获取(第一种方法)3&l ... [详细]
author-avatar
粅媞em亼啡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有