Unity设计模式——装饰模式

news2024/12/22 23:13:37

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

Component类:

abstract class Component : MonoBehaviour
{
    public abstract void Operation();
}

 ConcreteComponent类:

class ConcreteComponent : Component
{
    public override void Operation()
    {
        Debug.Log("具体对象操作");
    }
}

 Decorator类:

abstract class Decorator : Component
{
    protected Component component;
    public void SetComponent(Component component)
    {
        this.component = component;
    }
    public override void Operation()
    {
        if(component != null)
        {
            component.Operation();
        }
    }
}

 ConcreteDecoratorA类:

class ConcreteDecoratorA : Decorator
{
    //此类特有的功能,区别于ConcreteDecoratorB
    private string addState;
    public override void Operation()
    {
        //首先运行元Component的Operation()
        //再执行本类功能,对原Component进行修饰
        base.Operation();
        addState = "new state";
        Debug.Log("具体装饰对象A的操作");
    }
}

  ConcreteDecoratorB类:

class ConcreteDecoratorB : Decorator
{
    public override void Operation()
    {
        //首先运行元Component的Operation()
        //再执行本类功能,对原Component进行修饰
        base.Operation();
        AddBehavior();
        Debug.Log("具体装饰对象B的操作");
    }

    //本类特有的方法
    private void AddBehavior()
    {
        
    }
}

客户端:

class Main : MonoBehaviour
{
    private void Start()
    {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA a = new ConcreteDecoratorA();
        ConcreteDecoratorB b = new ConcreteDecoratorB();

        a.SetComponent(c);
        b.SetComponent(a);
        b.Operation();

    }
}

输出结果:

具体装饰对象A的操作 具体装饰对象B的操作 具体对象操作

        装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自已的功能,不需要关心如何被添加到对象链当中。        

        如果只有一个Concrete Component类而没有抽象的Component类,那么Decorator类可以是Concrete Component的一个子类。同样道理,如果只有一个Concrete Decorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和Concrete Decorator的责任合并成一个类。

        起初的设计中,当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。

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

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

相关文章

微信小程序 movable-area 区域拖动动态组件演示

movable-area 组件在小程序中的作用是用于创建一个可移动的区域,可以在该区域内拖动视图或内容。这个组件常用于实现可拖动的容器或可滑动的列表等交互效果。 使用 movable-area 组件可以对其内部的 movable-view 组件进行拖动操作,可以通过设置不同的属…

怎么防止重要文件夹丢失?文件夹安全如何保护?

我们在使用电脑的过程中,会将重要数据放在文件夹中,那么,我们该怎么防止重要文件夹丢失呢?下面我们就一起来了解一下。 EFS加密 EFS加密可以对于NTFS卷上的文件夹进行加密,加密后的文件夹将只允许加密时登录系统的用户…

Bigemap 在生态环境督察工作中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 业务背景 用户是一家科技公司,业务线主要是配合省生态厅环境督察应用工作,他们技术人员先是基于卫星遥感去发现生态环境破坏问题线索&#xff…

详解SIFT、SURF和ORB特征点检测和描述算法

文章目录 0 引言1 SIFT算法1.1 主要目的1.2 主要步骤1.3 示例代码 2 SURF算法2.1 主要目的2.2 主要步骤2.3 示例代码 3 ORB算法3.1 主要步骤3.2 代码示例 4 三者对比 0 引言 本文主要对SIFT、SURF和ORB特征点检测和描述算法进行详细的学习和比较。 ⚠️ ⚠️ ⚠️ &#xff1a…

网站为什么一定要使用SSL证书?

在现代社会,随着互联网的快速发展,越来越多的人开始使用网络来完成日常生活中的各种任务。而在这个过程中,网站作为网络中最重要的组成部分之一,也逐渐成为了人们日常生活中的不可或缺的一部分。但是,随着网络攻击和数…

深入分析APK文件格式

前言 最近在升级项目的 Gradle 及 AGP 版本,在进行APK编辑再压缩时遇到了前后压缩比不一致的问题,所以抽空又一总结了下 APK (ZIP) 文件格式。 无论是使用 7z 进行包体积优化,或是快速构建多渠道包,又或是V2、V3签名等都是基于 …

问卷调查中常见问题及解决方法

随着技术和市场的日益发展,问卷调查已经成为了人们了解客户需求和反馈的一种必要手段。但是,问卷调查也面临着一些问题。在本文中,我们将探讨一些常见问题,问卷调查会遇到什么问题?怎么解决?并提供一些解决…

【斗破年番】火火抱彩鳞把她整害羞啦!女王解锁新造型,身形丰满超有料

Hello,小伙伴们,我是小郑继续为大家深度解析斗破年番系列。 斗破年番已经更新,这集的精彩程度可以说出乎预料。不论是节奏的把控,打戏的呈现还是氛围的营造都十分的出彩。尤其是在萧炎施展三千雷动时运用的三年之约时的BGM简直让观感体验瞬间…

审计和风控做什么——企业审计和风控工作的相同和不同

审计和风控是现代企业管理中两个重要的领域。它们在企业和社会组织的运营中发挥着重要作用。本文将探讨审计和风控的异同点。 一、审计和风控的定义 审计是指对一个组织或个人财务报表、业务过程、内部控制和风险管理等方面进行审核的活动。它的目的是发现潜在的问题、风险和控…

CUDA学习笔记2——CUDA程序基本框架

CUDA向量运算 CUDA程序的基本框架为: 头文件包含 常量定义/宏定义 C 自定义函数和CUDA核函数声明 int main(void) { 分配主机与设备内存 初始化主机中的数据 将部分数据从主机拷贝至设备 调用核函数在设备中进行计算 将部分数据从设备拷贝至主机 释放主机与设备内存…

采集网页数据保存到文本文件---爬取古诗文网站

访问古诗文网站(https://so.gushiwen.org/mingju/) 会显示出这个页面,里面包含了很多的名句,点击某一个名句(比如点击无处不伤心,轻尘在玉琴)就会出现完整的古诗 我们点击鼠标右键,点…

【C++设计模式之责任链模式:行为型】分析及示例

简介 责任链模式是一种行为型设计模式,它允许将请求沿着处理链传递,直到有一个处理器能够处理该请求。这种模式将请求的发送者和接收者解耦,同时提供了更高的灵活性和可扩展性。 描述 责任链模式由多个处理器组成一个处理链,每…

如何批量获取拼多多商品详情数据,拼多多商品详情API接口

批量获取拼多多商品详情数据可以采用以下方式: 使用拼多多开放平台API接口。 拼多多开放平台提供了API接口,可以通过API接口获取拼多多平台上的商品信息,使用API接口需要进行权限申请和认证,操作较为复杂。使用第三方工具。 市面…

Transformer预测 | Pytorch实现基于Transformer的锂电池寿命预测(NASA数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

网络安全(黑客)——自学篇

什么是网络安全? 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻…

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码:五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为:EP4CE6F17C8 EEPROM芯片型号为:24L…

[C++从入门到精通] 11.回顾类内初始化、默认构造函数、=default

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用seleniumphantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*-from selenium import webdriver from selenium.webdriver.common.keys import Keysimp…

辅助寄存器是干什么用的

目录 请问CPU 的 MREQ 引脚和 IORQ 引脚分别是干什么用的 那这里的引脚是什么含义呢? 程序是指令和数据的集合 辅助寄存器是干什么用的 寄存器的用途取决于它的类型 PC 寄存器也叫作“程序指针”,存储着指向 CPU 接下来 要执行的指令的地址。PC 寄存…

jmeter添加断言(详细图解)

先创建一个线程组,再创建一个http请求。 为了方便观察,我们添加两个监听器,察看结果树和断言结果。 添加断言:响应断言,响应断言也是比较常用的一个断言 设置响应断言:正常情况下响应代码是200。选择响应代…