浅谈PHP设计模式的装饰器模式

简介

装饰器模式又叫做装饰者模式,属于结构型的设计模式。
指的是在不改变原类文件和使用继承的情况下动态扩展这个对象的功能,从而修饰源数据。
组成:
抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

适用场景

适用于多继承,且不改变原数据的场景。当然,是可以通过继承的方式来达到同样的效果,但是继承耦合度很大。

优点

  1. 装饰器模式是继承的一种替代方式,通过组合的方式完成继承的功能,降低继承的强关联耦合。
  2. 降低类间的耦合。被装饰类和装饰类都可以独立发展,不会相互影响。
  3. 符合开闭原则。
  4. 继承是静态地给类增加功能,而装饰模式则是动态地增加功能,更灵活。

缺点

装饰器模式会增加许多子类,增加程序复杂性。

其它

为什么不用继承?
是可以通过继承的方式装饰原有的类,但是一旦继承关系确认起来,想要再次扩展,就需要更多的子类,由于继承是强依赖关系,那么一定会产生很多的耦合。
为此产生了装饰器模式,有更好的横向扩展方案。

代码

//定义一个装饰器模式的契约
interface RenderInterface {
    public function renderData();
}


//按照RenderInterface契约,实现一个传递数据的方法
class Init implements RenderInterface {
    private $data;
    public function __construct($data) {
        $this->data = $data;
    }

    public function renderData() {
        return $this->data;
    }
}


/**
装饰者必须实现渲染接口类 RenderInterface 契约,这是该设计模式的关键点。否则,这将不是一个装饰者而只是一个自欺欺人的包装。
创建抽象类 RendererDecorator (渲染器装饰者)实现渲染接口。
*/
abstract class RendererDecorator implements RenderInterface {
    protected $object;
    public function __construct(RenderInterface $object) {
        $this->object = $object;
    }
}


//按照RenderInterface契约,实现一个自增的类
class Increment extends RendererDecorator {
    public function renderData() {
        return $this->object->renderData() + 1;
    }
}


//按照RenderInterface契约,实现一个自减的类
class Decrement extends RendererDecorator {
    public function renderData() {
        return $this->object->renderData() - 1;
    }
}

//调用端=====================================================
$init = new Init(1);
echo (new Increment($init))->renderData();
echo (new Decrement($init))->renderData();
echo (new Init(1))->renderData();

原文链接:https://www.cnblogs.com/phpphp/p/16849734.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的装饰器模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月19日

相关文章

  • 学习php设计模式 php实现命令模式(command)

    学习PHP设计模式是PHP开发者提升自己技能的重要途径之一,其中命令模式是一种常用的设计模式。下面就为大家介绍如何学习PHP实现命令模式的攻略。 什么是命令模式? 命令模式是一种行为型设计模式,它将请求封装成对象,以便于参数化和传递给不同的方法。这个模式允许请求的发送者和接收者之间解耦,通过对象进行调用。 如何实现命令模式? 在实现命令模式时,需要创建一个接…

    PHP 2023年5月24日
    00
  • PHP与Web页面的交互示例详解一

    以下是“PHP与Web页面的交互示例详解一”的完整攻略: 简介 PHP是一种常用的服务器端语言,常用于动态Web页面的开发。Web页面可以向PHP发送请求,PHP可以处理请求并返回处理结果。在这个过程中,Web页面与PHP之间需要进行交互。 示例说明1:使用表单提交数据到PHP脚本 当Web页面需要向PHP脚本发送数据时,可以使用表单来传递数据。具体步骤如下…

    PHP 2023年5月27日
    00
  • php实现的生成排列算法示例

    首先,生成排列算法是一种将一组元素重新排列的算法。PHP作为一种流行的Web编程语言之一,能够很方便地实现这个算法。接下来,将详细讲解“PHP实现的生成排列算法示例”的完整攻略,包括两个示例。 示例1:使用PHP内置函数实现生成排列算法 PHP提供了一个内置函数permutations,可以用来轻松地生成排列。此函数接受一个数组作为参数,返回其所有可能的排列…

    PHP 2023年5月26日
    00
  • php中的Base62类(适用于数值转字符串)

    PHP中的Base62类 Base62类是一种数值转字符串的工具,它将数字从10进制转换为62进制后再转化为字符串,适用于生成随机字符串、短链接等场景。下面就来详细讲解如何在PHP中使用Base62类完成这一操作。 安装 Base62类并不是PHP的原生类,需要使用composer进行安装。在安装前需要安装composer(PHP的包管理工具),安装方法见官…

    PHP 2023年5月26日
    00
  • PHP实现多进程并行操作的详解(可做守护进程)

    我可以给你详细讲解如何使用PHP实现多进程并行操作并作为守护进程运行的方法。 什么是多进程并行操作 多进程并行操作是指程序可以同时运行多个进程,每个进程可以独立地执行不同的任务。这个功能在某些场景下非常有用,特别是在需要执行耗时任务或需要处理大量数据时。对于PHP程序员来说,使用多进程并行操作可以提高程序的性能。 如何实现多进程并行操作 在PHP中,实现多进…

    PHP 2023年5月23日
    00
  • 如何在PHP中使用数组

    当我们需要在PHP中存储多个值时,数组是一个非常有用的数据结构。本文将详细讲解如何在PHP中使用数组,包括数组的定义、访问和操作,以及数组的一些常用函数。 定义数组 在PHP中,我们可以使用关键字array()来定义一个数组。数组可以包含任意数量的元素,每个元素可以存储任意类型的数据,例如字符串、数字、其他数组等等。 以下是一个定义包含三个元素的数组的示例:…

    PHP 2023年5月26日
    00
  • PHP登录验证码的实现与使用方法

    下面是详细的讲解“PHP登录验证码的实现与使用方法”的完整攻略。 简介 验证码是一种保证用户身份的有效方法。当用户注册或登录时,他们必须输入一个验证码,以验证他们确实是人类而不是机器自动化程序。这可以防止恶意程序在网站上进行刷屏、自动注册或垃圾邮件。 PHP是一种广泛使用的后端编程语言。PHP登录验证码可以很容易地与PHP结合使用以提高网站安全性。 实现方法…

    PHP 2023年5月26日
    00
  • windwos8.1中php环境配置方法

    下面是针对Windows 8.1中PHP环境配置方法的完整攻略: 1. 安装Apache服务器 在官网下载Windows版本的Apache服务器:https://httpd.apache.org/download.cgi 解压下载的安装包到任意目录,例如:C:\apache\ 进入C:\apache\bin目录,双击httpd.exe运行服务器 打开浏览器,…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部