【设计模式】装饰模式

news2024/9/17 8:35:30

设计模式

  • 【设计模式】工厂方法模式
  • 【设计模式】抽象工厂模式
  • 【设计模式】单例模式
  • 【设计模式】策略模式
  • 【设计模式】观察者模式
  • 【设计模式】装饰模式

一、介绍

装饰模式是一种结构型设计模式,它允许你通过将对象和对象装饰器分离来扩展对象的功能。装饰模式是一种动态地添加功能的方法,它允许你在运行时根据需要添加或删除对象的功能。

举个例子:很多游戏中的人物都是可以携带装备的,比如剑,盾,盔甲,戒指等。在获得这些装备后,玩家可以随意的穿戴卸下,最后形成不同的装饰效果。

二、优缺点

优点:

  • 可以在运行时添加或删除对象的功能。
  • 无需创建新子类即可扩展对象的行为。
  • 可以用多个装饰封装对象来组合多种行为。
  • 单一职责原则:可以将实现了许多不同行为的一个大类拆分为多个较小的类。

缺点:

  •  在封装器栈中删除特定封装器比较困难
  •  实现行为不受装饰栈顺序影响的装饰比较困难
  •  各层的初始化配置代码看上去可能会很不友好

三、核心结构

  • Component(组件):定义了基本组件接口,有被装饰器修改的操作方法。
  • ConcreteComponent(具体组件):组件的具体实现类。
  • Decorator(装饰器):基类,遵循与其他组件相同的接口。这个类的主要目的是为所有具体组件的装饰器定义包装接口。
  • ConcreteDecorator(具体装饰器):具体装饰器调用包装对象并以某种方式改变其结果。

四、代码实现

1、Component(组件):定义了基本组件接口,有被装饰器修改的操作方法。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:37
 */

namespace app\admin\service\mode\decorator;

/**
 * 定义一个接口,用于装饰器类实现
 */
interface Component
{
    public function operation();
}

2、ConcreteComponent(具体组件):组件的具体实现类。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:40
 */

namespace app\admin\service\mode\decorator;

/**
 * 具体组件,实现Component接口
 */
class ConcreteComponent implements Component
{

    /**
     * @return string
     * @Author: fengzi
     * @Date: 2024/6/26 10:40
     */
    public function operation()
    {
        // TODO: Implement operation() method.
        return "魔法师";
    }
}

3、Decorator(装饰器):基类,遵循与其他组件相同的接口。这个类的主要目的是为所有具体组件的装饰器定义包装接口。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:41
 */

namespace app\admin\service\mode\decorator;

/**
 * 定义一个装饰器类,用于包装其他类
 */
class Decorator implements Component
{
    protected Component $component;

    public function __construct(Component $component)
    {
        $this->component = $component;
    }

    public function operation()
    {
        return $this->component->operation();
    }
}

4、ConcreteDecorator(具体装饰器):具体装饰器调用包装对象并以某种方式改变其结果。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:43
 */

namespace app\admin\service\mode\decorator;

class ConcreteDecoratorA extends Decorator
{
    public function operation()
    {
        return parent::operation() . " 装备上了[魔法棒] ";
    }
}
<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:43
 */

namespace app\admin\service\mode\decorator;

class ConcreteDecoratorB extends Decorator
{
    public function operation()
    {
        return parent::operation() . " 装备上了[魔法袍] ";
    }
}

5、客户端调用

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/6/26
 * Time: 10:47
 */

namespace app\admin\controller\mode\decorator;

use app\admin\service\mode\decorator\ConcreteComponent;
use app\admin\service\mode\decorator\ConcreteDecoratorA;
use app\admin\service\mode\decorator\ConcreteDecoratorB;

/**
 * 客户端
 */
class ClientController
{
    public function index()
    {
        /**
         * 不用装饰器的情况下人物无任何的装备。
         */
        $base = new ConcreteComponent();
        echo $base->operation();
        echo PHP_EOL."\n";

        /**
         * 使用装饰器的情况下人物添加新的装备
         */
        $decoratorA = new ConcreteDecoratorA($base);

        /**
         * 人物添加新的装备
         */
        $decoratorB = new ConcreteDecoratorB($decoratorA);
        echo $decoratorB->operation();
        die();
    }
}

6、调用结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机vmware网络设置

一、网络分类 打开vmware workstation网络编辑器可以知道有三种网络类型&#xff0c;分别是&#xff1a;桥接模式、nat模式、仅主机模式。 1、桥接模式 桥接模式是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下, 类似于把物理主机虚拟为一个交换机, 所有设…

设计模式的七大原则

1.单一职责原则 单一职责原则(Single responsibility principle)&#xff0c;即一个类应该只负责一项职责。如类A负责两个不同职责&#xff1a;职责1&#xff0c;职责2。当职责1需求变更而改变A时&#xff0c;可能造成职责2执行错误&#xff0c;所以需要将类A的粒度分解为A1、…

2-32 基于matlab的最小二乘估计递推算法

基于matlab的最小二乘估计递推算法&#xff0c;生成M序列&#xff0c;对参数估计值进行辨识&#xff0c;输出估计误差结果。程序已调通&#xff0c;可直接运行。 2-32 最小二乘估计递推算法 参数估计 - 小红书 (xiaohongshu.com)

C# Winform 系统方案目录的管理开发

在做一个中等复杂程度项目时&#xff0c;我们通常有系统全局配置&#xff0c;还要有对应的方案目录的管理和更新。 比如我们有如下需求&#xff1a;开发一个方案管理&#xff0c;可以新建、打开和保存方案&#xff0c;同时还需要保存方案中的各种文件。我设计的采用目录管理和…

计算器原生js

目录 1.HTML 2.CSS 2.JS 4.资源 5.运行截图 6.下载连接 7.注意事项 1.HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

IDEA 中的调试方式(以 java 为例)

文章目录 IDEA 中的调试方式(以 java 为例)1. 基本介绍2. 断点调试的快捷键2.1 设置断点并启动调试2.3 快捷键 IDEA 中的调试方式(以 java 为例) 在开发中查找错误的时候&#xff0c;我们可以用断点调试&#xff0c;一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 …

WEB前端01-HTML5基础(01)

一.WEB相关概念 软件架构 C/S: Client/Server &#xff08;客户端/服务器端&#xff09;&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;用户体验好 缺点&#xff1a;开发、安装&#xff0c;部署&#xff0c;维护麻烦 B/S: Br…

【银河麒麟服务器操作系统】系统夯死分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 512G 整机类型/架构&#xff1a; X86_64 【内核版本】 4.19.90-25…

IDEA的JAVA版本没有8怎么办

问题&#xff1a; 很多小伙伴会出现如下的情况&#xff0c;java的版本很高&#xff0c;没有8 解决 更换IDEA内置的Server URL的镜像地址 就是这个 把其中的地址换成 https://start.aliyun.com/ https://start.aliyun.com/ 我们可以看到JAVA 8就出现了

Mysql的语句执行很慢,如何分析排查?

1、检查服务器性能是否存在瓶颈 如果系统资源使用率比较高&#xff0c;比如CPU,硬盘&#xff0c;那访问肯定会慢&#xff0c;如果你发现是Mysl占比比较高&#xff0c;说明Mysql的读写频率高&#xff0c;如果本身网站访问量不大&#xff0c;说明你的sql参数&#xff0c;sql语句查…

气膜建筑的消防应急门:安全与保障—轻空间

气膜建筑&#xff0c;作为一种现代化的建筑形式&#xff0c;以其独特的结构和多功能用途受到广泛欢迎。然而&#xff0c;消防安全作为任何建筑的核心问题&#xff0c;尤其受到关注。为了确保在紧急情况下的安全疏散&#xff0c;气膜建筑在设计和建设过程中&#xff0c;特别重视…

网络安全高级工具软件100套

1、 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权协议&#xff09;。 它…

LabVIEW阀门运动PCT测试

开发了一套基于LabVIEW的阀门运动PCT&#xff08;Pressure-Composition-Temperature&#xff09;测试方法。该系统通过控制阀门运动&#xff0c;实现对氢气吸附和解吸过程的精确测量和控制。所用硬件包括NI cDAQ-9174数据采集模块、Omega PX309压力传感器、SMC ITV2030电动调节…

Intel 和 ARM 对ROP/COP/JOP的缓解措施

文章目录 前言一、ROP1.1 Intel1.2 ARM 二、COP/JOP2.1 Intel2.2 ARM 前言 前向转移(forward)&#xff1a;将控制权定向到程序中一个新位置的转移方式, 就叫做前向转移, 比如jmp和call指令。这里我们主要保护的间接跳转&#xff0c;间接跳转是运行时才知道函数地址&#xff0c…

虚幻引擎ue5如何调节物体锚点

当发现锚点不在物体上时&#xff0c;如何调节瞄点在物体上。 步骤1&#xff1a;按住鼠标中键拖动锚点&#xff0c;在透视图中多次调节锚点位置。 步骤2:在物体上点击鼠标右键点击-》锚定--》“设置为枢轴偏移”即可。

百日筑基第十九天-一头扎进消息队列2

百日筑基第十九天-一头扎进消息队列2 消息队列的通讯协议 目前业界的通信协议可以分为公有协议和私有协议两种。公有协议指公开的受到认可的具有规 范的协议&#xff0c;比如 JMS、HTTP、STOMP 等。私有协议是指根据自身的功能和需求设计的协 议&#xff0c;一般不具备通用性&…

AI网络爬虫023:用deepseek批量提取天工AI的智能体数据

文章目录 一、介绍二、输入内容三、输出内容一、介绍 天工AI的智能体首页: F12查看真实网址和响应数据: 翻页规律: https://work.tiangong.cn/agents_api/square/sq_list_by_category?category_id=7&offset=0 https://work.tiangong.cn/agents_api/square/sq_list_b…

MUR2060CTR-ASEMI无人机专用MUR2060CTR

编辑&#xff1a;ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&#…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

Python 的 metaclass

文章目录 先说结论1. metaclass 的作用2. 主要的执行过程 1. metaclass.__new__2. metaclass.__call__关于 metaclass.__init__ 3. metaclass.__prepare__4. 自动创建 __slots__ 属性4.1 metaclass 的接口类4.2 metaclass conflict 5. Class metaprogramming 先说结论 1. meta…