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

yizhihongxing

简介

装饰器模式又叫做装饰者模式,属于结构型的设计模式。
指的是在不改变原类文件和使用继承的情况下动态扩展这个对象的功能,从而修饰源数据。
组成:
抽象构件(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打印输出棋盘的实现方法”的攻略: 问题描述 本题要求通过PHP编写一个脚本,实现在控制台中打印输出棋盘的效果。 解决方案 步骤1:通过多维数组实现棋盘 首先,我们需要声明一个二维数组来存储棋盘的信息: <?php $chess_board = array( array(‘ ‘, ‘O’, ‘X’, ‘O’, ‘X’,…

    PHP 2023年5月26日
    00
  • 使用淘宝ip地址库查ip的示例

    使用淘宝IP地址库是一种查询IP地址信息的方法,可以获取IP所属的地区、运营商等信息。以下是使用淘宝IP地址库查IP的完整攻略。 步骤一:下载IP地址库 访问淘宝IP地址库下载页面。 选择需要下载的文件,如“纯真版IP地址库”或“GeoIP2-CN文件”,点击下载。 步骤二:导入IP地址库 打开生成的IP地址库文件,将它导入到你的项目中。 根据你的编程语言,…

    PHP 2023年5月27日
    00
  • 46 个非常有用的 PHP 代码片段

    这里是关于“46 个非常有用的 PHP 代码片段”的详细攻略。 1. 什么是“46 个非常有用的 PHP 代码片段”? “46 个非常有用的 PHP 代码片段”是一个由网站作者整理的,适用于PHP程序员的代码集合。该代码集合包括了一系列常见的代码片段,可提高PHP程序员的开发效率和代码质量。 2. 如何获取“46 个非常有用的 PHP 代码片段”? 你可以通…

    PHP 2023年5月24日
    00
  • PHP终止脚本运行三种实现方法详解

    PHP终止脚本运行三种实现方法详解 1. die() 函数 die() 是 PHP 中常用的终止脚本运行的函数之一。它允许我们在代码的任何部分停止脚本的执行并输出一条消息。 <?php // 输出消息并停止脚本运行 die("程序结束!"); // 下面的代码不会被执行 echo "Hello World!"; …

    PHP 2023年5月23日
    00
  • 调试php程序的简单步骤

    调试 PHP 程序是我们在开发中常常需要做的事情之一。下面是几个简单的步骤,可以帮助我们快速地找到程序中的问题所在: 1. 使用错误报告来定位问题 PHP 提供了丰富的错误报告功能,可以帮助我们定位错误的原因。我们可以在脚本或网站的主配置文件中开启错误报告功能,这样在运行时就可以打印出程序运行过程中的错误信息。在开发调试阶段,我们可以将错误报告级别设置为最高…

    PHP 2023年5月23日
    00
  • 详解PHP文件的自动加载(autoloading)

    那我来详细讲解一下“详解PHP文件的自动加载(autoloading)”的完整攻略。 什么是PHP文件的自动加载 在编写PHP程序时,我们通常会使用许多不同的类和函数来完成相应的功能,这些类和函数通常被定义在不同的文件中。而在PHP中,如果我们需要使用某个文件中的类或函数,通常需要使用 require 或 include 函数将其引入,才能在代码中正常使用这…

    PHP 2023年5月26日
    00
  • php实现留言板功能(代码详解)

    下面是关于“PHP实现留言板功能(代码详解)”的完整攻略: 简介 留言板功能是网站常用的功能之一,它能够让用户在网站上发布留言并进行展示,是网站互动的一个重要部分。而 PHP 作为一种常见的后端语言,能够方便地实现留言板功能。 整体思路 实现留言板的一个基本思路是,将用户提交的留言保存在服务器端的本地数据库中,然后在网页上展示出来。 具体实现的步骤如下: 编…

    PHP 2023年5月23日
    00
  • PHP HTML代码串 截取实现代码

    下面我将详细讲解 PHP HTML 代码串截取实现代码的完整攻略。 什么是 PHP HTML 代码串截取 PHP HTML 代码串截取指的是从一个包含 HTML 代码的字符串中截取出想要的部分。在实际开发中,我们经常需要从一个 HTML 页面中获取某些特定的标签内容或属性,这时候我们可以使用 PHP 的字符串截取函数来实现。 如何实现 PHP HTML 代码…

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