php设计模式之装饰模式应用案例详解
作者:赵筱蕊 发布时间:2023-11-14 13:37:20
本文实例讲述了php设计模式之装饰模式。分享给大家供大家参考,具体如下:
介绍
装饰者模式(Decorator Pattern)允许你向一个现有的对象添加新的功能,同时又不改变其结构。 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
主要角色
抽象构件(Component)角色:定义一个独享接口,以规范准备接收附加职责的对象,从而可以给这些对象动态的添加职责。
具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。
下面是使用装饰模式的一个简单实现:
class RequestHelper{}
abstract class ProcessRequest{
abstract function process(RequestHelper $req);
}
class MainProcess extends ProcessRequest{
function process(RequestHelper $req)
{
print __CLASS__.": doing something useful with request\n";
}
}
abstract class DecorateProcess extends ProcessRequest{
protected $processRequest;
function __construct(ProcessRequest $pr)
{
$this->processRequest = $pr;
}
}
和之前一样,我们定义了一个抽象基类(ProcessRequest)、一个具体的组件(MainProcess)和一个抽象装饰类(DecorateProcess)。 MainProcess::process()方法仅仅报告方法被调用,并没有其他功能。DecorateProcess为他的子类保存了一个ProcessRequest对象。下面是一些简单的具体装饰类:
class LogRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": logging request\n";
$this->processRequest->process($req);
}
}
class AuthenticateRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": authenticating request\n";
$this->processRequest->process($req);
}
}
class StructureRequest extends DecorateProcess{
function process(RequestHelper $req)
{
print __CLASS__.": structuring request\n";
$this->processRequest->process($req);
}
}
装饰类的每一个process()方法在调用引用的processRequest对象的Process()方法前输出一条信息。
现在我们可以在运行时合并这些类的对象,创建过滤器来对每一个请求按不同的顺序执行不同操作。下面的代码将所有具体类的对象组合成为一个过滤器:
$process = new AuthenticateRequest(new StructureRequest(
new LogRequest(
new MainProcess()
)));
$process->process(new RequestHelper());
执行代码会得到下面的输出结果:
Authenticate
Request: authenticating request
StructureRequest: structuring request
LogRequest: logging request
MainProcess: doing something useful with request
优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个代替模式,装饰模式可以动态扩展一个实现类的功能。
缺点:
多层装饰比较负责。
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/zhaoxiaoruiR/article/details/88058380


猜你喜欢
- 思路1.将姓名和单号填入excel表格里面2.读取excel表格,将所有姓名存到ExeclName这个list中,单号存到ExeclId3.
- 一、前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理
- 1. 使用性能分析器Golang提供了内置的性能分析工具 pprof,可以帮助您分析和优化应用程序的性能瓶颈。下面是使用
- python类class定义及其初始化定义类,功能,属性一般类名首字母大写class Calculator:#名字和价格是属性
- 先建立2个测试表,在id列上创建unique约束。 mysql> create table test1(id int,name var
- 一、介绍使用pandas.DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线,默认按照列columns的名称在适当的位置
- 1、使用ImageField先安装pillow模块pip install pillow2、在app的models中设置class Image
- 前言昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib。而POP服务器往回传的
- Windows安装mysql-5.7.17-winx64.zip方式记录<1.去官网上下载.zip格式的文件.2.解压到一个文件夹,这
- 一、format格式输出字符串使用 % 操作符对各种类型的数据进行格式化输出,这是早期 Python提供的方法。字符串类型(str)提供了
- in Navicat for MySQL,PostgreSQL and Oracle 产生错误的原因是mysql帐户连接到远程mysql服务
- 【ThinkPHP版本查询】dump(THINK_VERSION);模板获取get参数{$Think.get.pageNumber}或者$R
- 1、Window.onerror事件onerror事件用来协助处理页面中的JavaScript错误。当页面上出现异常时,error事件便在w
- 一、使用 PyCharm 软件安装 pandas 包1、打开 PyCharm2、点击右上角 “Files” →“Settings...”3、
- 本段源码可以学习的地方:1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建;2. 可以重写一些魔术方法,比如 __new
- 今天在测试php程序的时候,出现了一个错误提示:Cannot use a scalar value as an array,这个错误提示前几
- 微信小程序实现人脸识别,具体应用场景 前端实现人脸信息采集 拍到正面照片 发送给后端该方法暂
- 目录1.字典字典的相关操作获取字典的长度2.集合1.字典字典是python中的一种数据结构。它的内容由**键-值(key-value)**的
- 前言前端小伙伴们平常在开发过程中文件上传是经常遇到的一个问题,也许你能够实现相关的功能,但是做完后回想代码实现上是不是有点"力不从
- 实验原理模拟电脑通过串口与Arduino开发板通信,并通过网页实现简单交互开发环境1、Windows102、Python3.103、Prot