百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

PHP设计模式之装饰模式

myzbx 2025-02-10 13:32 18 浏览

装饰模式属于结构型模式

概述:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

装饰者模式:

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案

装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责。这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

装饰模式中主要角色:

抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。

具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。

装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。

具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。

装饰模式的优点:

1、比静态继承更灵活;

2、避免在层次结构高层的类有太多的特征

装饰模式的缺点:

1、使用装饰模式会产生比使用继承关系更多的对象。并且这些对象看上去都很想像,从而使得查错变得困难。

装饰模式适用场景:

1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2、处理那些可以撤消的职责,即需要动态的给一个对象添加功能并且这些功能是可以动态的撤消的。

3、当不能彩生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

个人举例:

田老师点餐

装饰模式 一种算法 链表

namespace haibao\design\web\view\design;

use haibao\design\web\common\design\decorator\Coffee;

use haibao\design\web\common\design\decorator\Milk;

use haibao\design\web\common\design\decorator\Suger;

class Decorator extends \haibao\design\web\view\Base{

protected function preRender(){

header("Content-type: text/html; charset=utf-8");

$coffee = new Coffee();

$coffee = new Milk($coffee);

$coffee = new Suger($coffee);

print_R($coffee);

//$coffee = new Milk($coffee);

echo $coffee->cost();

}

}

/**

* 咖啡类

*/

namespace haibao\design\web\common\design\decorator;

class Coffee extends Menu{

public function __construct(){

$this->name = '咖啡';

}

public function cost(){

echo $this->name."
";

return 2;

}

}

/**

* 咖啡装饰类

*/

namespace haibao\design\web\common\design\decorator;

class CoffeeDecorator extends Menu{

public function __construct(){

}

public function cost(){

return 0.1;

}

}

/**

* 菜单类

*/

namespace haibao\design\web\common\design\decorator;

abstract class Menu{

public $name;

abstract public function cost();

}

/**

* 牛奶类

*/

namespace haibao\design\web\common\design\decorator;

class Milk extends CoffeeDecorator{

public $menu;

public function __construct($menu){

$this->name = '牛奶';

if($menu instanceof Menu){

$this->menu = $menu;

}

}

public function cost(){

echo $this->name."
";

return $this->menu->cost() + 2;

}

}

/**

* 牛奶类

*/

namespace haibao\design\web\common\design\decorator;

class Suger extends CoffeeDecorator{

public $menu;

public function __construct($menu){

$this->name = '糖块';

if($menu instanceof Menu){

$this->menu = $menu;

}

}

public function cost(){

echo $this->name."
";

return $this->menu->cost() + 3;

}

}

相关推荐

Nextoffer极客编程挑战#022:使用HTML5画布生成文字淡入淡出效果

给定如下HTML:<divid="container"><canvasid="MyCanvas"width="350"height="200">不支持HTML5画布&l...

AI在线智能问答+Python实现(ai问答机器人)

人生苦短,我用Python!嗨,我是浪仔,你的Python造梦师~今天让我们一起来开发一款AI智能问答小工具!本小工具是一款基于Python编程语言开发的AI在线智能问答平台,采用爬虫采集数据...

OpenAI发布新功能——Canvas,写作+编程能力超级提升

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。此文仅在今日头条发布,任何平台不得搬运,搬运必究!OpenAI发布新功能——Canvas,写作+编程能力超级提升OpenAI的Canvas...

英伟达最新AI技术可将文字转化为逼真的图像

英伟达的GauGAN技术已经展示了它的能力--将简单的草图变成逼真的图像。从那时起,我们看到它被应用于NVIDIACanvas,但似乎这家GPU巨头正在用其人工智能(AI)瞄准更高的目标,其推出了一...

OpenAI技术直播第四弹!推出ChatGPT内置工具Canvas,有三大核心功能

每经编辑:毕陆名昨天的Sora掀起热潮,今天OpenAI又给我们带来了升级版Canvas。Canvas正式向所有用户开放,并与OpenAI的主要模型深度集成。Canvas内置在ChatGPT中,打开C...

怎样设置EditText内部文字被锁定不可删除和修改

在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...

微信小程序canvas使用(小程序canvas生成图片并保存)

在微信小程序中,你可以通过以下步骤使用canvas:在index.wxml文件中添加canvas元素。例如:。在index.js文件中,通过wx.createSelectorQuery()获取canv...

我尝试了ChatGPT Canvas,让写作和编码变得更简单

#头条精品计划#快速导读ChatGPT画布界面旨在提升写作和编码体验,特别是为ChatGPTPlus和Team订阅者提供的功能。用户可以利用人工智能优化文本和代码,提高工作效率。画布界面...

ChatGPT推出Canvas界面:让编写和编码变得更容易

鞭牛士报道,10月5日消息,据外电报道,OpenAI为ChatGPT推出了全新的“Canvas”界面,允许用户在并排协作中调整聊天机器人生成的文本或代码部分。Canvas在现有的ChatG...

鸿蒙开发之绘制文字(fillText 和 stroke)

在HarmonyOS中,使用TS(TypeScript)语法进行画布(Canvas)开发时,fillText和strokeText是两个常用的方法,分别用于填充文本和绘制文本边框。以下是这两个方法的详...

Canvas编写Python代码也太好用了!

大家知道这个月OpenAI密集发布新产品,连续12天以短视频方式每天公布一个产品功能。这两天,OpenAI公布了新的功能Canvas,顾名思义,Canvas是画布的意思,这是一个使用ChatGPT协作...

五子棋游戏(五子棋游戏网页版)

完整的游戏功能:黑白双方轮流下棋自动判定胜负支持重新开始游戏美观的界面:标准的15×15棋盘棋盘带有网格线和五个星位点棋子使用渐变效果,看起来更立体状态显示清晰用户友好:实时显示当前回合信息有效的落子...

利用Photoshop制作专业展板的详细指南与技巧分享

怎么用PS做展板(HowtoCreateaDisplayBoardUsingPhotoshop)  在现代设计中,AdobePhotoshop(通常简称为PS)是一个强大的工具,广泛...

Android 开发中文引导-动画和图形概述

安卓系统提供了各种强大的API,用来将动画应用于界面元素和自定义2D和3D图形的绘制当中。下面的小节大概的描述了可用的API和系统功能并帮助你决定那个方案最适合你的需要。动画安卓框架提供了两种动画系统...

小白鞋过时了?早着呢!(小白鞋2020)

在巴黎待了好几天了。这次是受爱马仕邀请来看它家2017秋冬女装秀的。昨天看完,本想今天就来跟大家分享我秀场见闻。但今天还要参观爱马仕皮具工坊、新品陈列室,明天再一次性地跟你们分享吧。就先发之前准备好的...