首页 > 编程语言 >浅谈PHP设计模式的装饰器模式

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

时间:2022-11-02 02:55:05浏览次数:31  
标签:function PHP 浅谈 继承 public renderData 设计模式 装饰 RenderInterface

简介

装饰器模式又叫做装饰者模式,属于结构型的设计模式。
指的是在不改变原类文件和使用继承的情况下动态扩展这个对象的功能,从而修饰源数据。
组成:
抽象构件(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();

标签:function,PHP,浅谈,继承,public,renderData,设计模式,装饰,RenderInterface
From: https://www.cnblogs.com/phpphp/p/16849734.html

相关文章

  • 伪协议绕过死亡代码<?php exit();(file_put_contents)
    测试代码如下:<?phperror_reporting(0);$file=$_GET['file'];$content=$_POST['content'];file_put_contents($file,"<?phpexit();".$content);......
  • php加固
    PHP加固1.控制访问目录使用open_basedir选项能够控制PHP脚本只能访问指定的目录。open_basedir=/usr/www2.关闭危险函数disable_functions=system,passthr......
  • 快速了解Java设计模式
    背景Java二十三种设计模式的简单介绍,目的是能看懂别人写的设计模式代码,且能应用常用的设计模式。设计模式分类创建型模式工厂方法(Factory)工厂模式分为三种:简单工厂(不......
  • 浅谈笛卡尔树
    笛卡尔树(CartesianTree),是一种二叉树,每个节点都有两个信息\((x_i,y_i)\),其中把\(x_i\)单独拎出来看是一棵二叉搜索树(\(ls_u<u<rs_u\)),而把\(y_i\)拎出来是一个小根堆(\(......
  • PHP中session(报错Notice: Undefined index)无法获取值的原因(原因之一)与分析
    PHP中的SESSION问题:本文主题:在页面之间传递session时,两页面文件不在同文件夹中而导致session无法传递,报错Notice:Undefinedindex…此问题测试:文件结构:test文件夹:—gameI......
  • PHP接收xmlhttp.send传递的值代码例子
    注:Ajax中要加xmlhttp.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);来来添加HTTP头,不然php文件无法接收到传递的值Ajax代码:functioncolle......
  • php-XHTML与HTML区别
    XHTML与HTML的区别:  1、所有标签都使用小写字母                                        2、嵌套标签必须有恰当的格式......
  • 浅谈 web3
     web3——互联网的未来?  web3,很多人觉得是个骗局,是在割韭菜。 因为大部分介绍web3的文章都离不开NFT、数字货币、区块链、比特币、以太坊、元宇宙等概......
  • 浅谈大数据时代智能工厂能源管理系统的设计和应用
    陈盼安科瑞电气股份有限公司上海嘉定201801摘要:如今,传统制造业正在发生着巨大变革与创新,智能工厂概念应运而生,其中,能源管理系统是工厂生产资源管控的重要平台,是现代信息技......
  • 浅谈智能电表的预付费远程抄表及多回路监测系统设计及应用
    陈盼安科瑞电气股份有限公司上海嘉定201801【摘要】随着社会的发展,人工抄表这种费时费力、低效的工作模式将被淘汰,智能电表远程抄表系统应运而生。智能电表既能远程抄表,......