文章目录

  • 装饰模式
    • 结构
    • 实现
    • 应用场景
    • 利与弊

装饰模式

装饰模式是对象结构型模式,指在原来的对象上添加行为,且不改变对象的结构的模式。

装饰模式旨在解决组合搭配问题,同时不影响原有的对象类。如饭店中饭,汤,菜的组合,使用继承扩展的话,明显会出现类爆炸的现象,饭作为主要,汤和菜则是搭配,这样的组合。搭配组合如 饭,饭 + 汤,饭 + 菜等。使用装饰模式就可以轻松解决这个问题。

结构

说明

  • 部件(Component)- 规范部件和装饰类的行为
  • 具体部件(Concrete Component)- 实现部件行为,但本身的行为可以被装饰类修改
  • 抽象装饰(Decorator)- 继承部件类,同时包含其实例,这样可以引用具体的部件和装饰。而且将具体实现委托给子装饰。
  • 具体装饰(Concrete Decorator)- 实现装饰方法

实现

IKnife - 部件

    /// <summary>/// <para>刀类(组件类)</para>/// </summary>public interface IKnife{//攻击void Attack();//技能void Skill();}

OrdinaryKnife - 具体部件

 public class OrdinaryKinfe : IKnife{public void Attack(){Debug.Log("普通挥砍");}public void Skill(){Debug.Log("上挑");}}

KnifeDecorator - 装饰类

    public abstract class KinfeDecorator : IKnife{private readonly IKnife _knife;protected KinfeDecorator(IKnife knife){_knife = knife;}public virtual void Attack() => _knife.Attack();public virtual void Skill() => _knife.Skill();}

LightWave(光波),BloodPearl(血宝珠)- 具体装饰类

    public class LightWave : KinfeDecorator{public LightWave(IKnife knife) : base(knife){}public override void Attack(){base.Attack();Debug.Log("发出光波");}}public class BloodPearl : KinfeDecorator{public BloodPearl(IKnife knife) : base(knife){}public override void Skill(){base.Skill();Debug.Log("回血");}}

调用

    public class DecoratorExample : MonoBehaviour{private void Start(){//创建组件类IKnife knife = new OrdinaryKinfe();//添加气波装饰knife = new LightWave(knife);knife.Attack();knife = new BloodPearl(knife);knife.Skill();}}


通过虚函数的方式,子类装饰可以有选择的继承,它们需要添加功能方法。

应用场景

  • 当你需要无需修改代码的情况下,为对象添加行为时,可以使用此模式
  • 当继承扩展不可行时,如封闭类,我们也可以使用装饰模式进行扩展

利与弊

优点

  • 无需创建新的子类,即可扩展行为
  • 可以在运行时动态增加相关行为
  • 你可以用多个装饰组合行为
  • 通过多个装饰类和组件类的拆分,可以更加细致的完成各自的行为,符合单一职责原则

缺点

  • 删除相关装饰的行为,较为困难
  • 装饰类的行为实现受到方法栈顺序的影响

装饰类的抽象部件和抽象装饰不一定需要,如果对象只有一个装饰或部件时,即可不实现抽象,直接实现具体类即可。

装饰模式与适配器模式的最大区别,适配器模式是在原有接口不兼容的情况下,对接口功能的转换,而装饰模式是对原有对象的行为进行增强,且装饰模式的组合通常是在客户端创建

​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​​⚔️​

装饰模式 - Unity相关推荐

  1. Unity(入门、中级、中高级、高级)

    Unity Unity 入门 1.Unity的安装与激活 1.1.中国版与国际版 中国版 https://unity.cn/ 国际版 https://unity.com/ 1.2.Unity下载 ht ...

  2. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  3. Unity实现:23种设计模式、《游戏编程模式》

    目录 一.23种设计模式在Unity实现 Creational Patterns 创建型模式(5种) 工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 Structural Patterns ...

  4. C#之常用设计模式(unity版本)

                                                                      设计模式 一:设计模式之六大原则 六大原则是谁? ①单一职责原则 ② ...

  5. Unity游戏开发工程师 知识图谱

    三.Unity学前 1.C#基础 1.1.数据类型 值类型     引用类型     指针类型     装箱与拆箱 1.2.变量 定义     初始化 1.3.常量 定义     引用 1.4.运算符 ...

  6. 设计模式之装饰模式(Java实现)

    "怎么了,鱼哥?" "唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的却是一个X的, ...

  7. [Unity WWW] 跨域访问解决方法

    什么是跨域访问 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation).信任关系是连接在域与域之间的桥梁.当一个域与其他域建立了信任 ...

  8. unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)

    123 说: 雨松大大,有个问题想请教一下,我用UNET构建了个小场景,在电脑上可以客户端可以连接到服务器,Windows和Linux都可以,发布到安卓缺连不了,这是问什么呢 说: 求教一下,刚刚接触 ...

  9. unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程

    本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...

最新文章

  1. R语言ggplot2可视化将两个dataframe可视化的结果组合在一起实战:combining two plots from different data.frames
  2. UIPickerView详解
  3. 索引的优点,索引优化原则
  4. Java格式化日期和时间模式占位符
  5. mysql中视图的概念_MySql中的视图的概念及应用
  6. 双击打开Inventor文件
  7. 领域驱动设计:浅析 VO、DTO、DO、PO 概念、区别、用处
  8. iPhone成交额2秒破亿!京东11.11晚8点战报:5分钟家电成交额破20亿
  9. UI设计素材字体|三明治3D文字效果– 3个角度
  10. 小四轴之第二次飞行篇
  11. Informatica通过人工智能重新定义数据管理助力数据驱动型数字化转型
  12. MWC2010传递出什么信号?
  13. java foreach 赋值_java foreach 使用
  14. 设计(二) | PS功能快捷键(全)
  15. 单片机节日彩灯c语言,单片机节日彩灯控制器的设计Proteus仿真
  16. ubuntu opencv 安装
  17. zkdemo可以直接调用html,中控指纹机ZKBIOOnline BS开发包 含示例DEMO
  18. error: You must be logged in to the server (Unauthorized)报错处理
  19. 抢票软件之——py12306使用指南
  20. java 7 锁优化_自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化。这些优化主要包括锁消除(Lock Elision)、锁粗化(Lock Coarse...

热门文章

  1. SSM 实战项目遇到的问题
  2. 【51单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)
  3. php后端aes加密前端解密
  4. 数学模型复习资料---自用款--大家可以借鉴来复习--持续更新
  5. NProgress.js进度条
  6. ibm mq安装配置_在IBM Integration Bus v10和IBM MQ v8之间配置MQ连接
  7. Request Response
  8. kubectl命令使用滚动更新和回滚
  9. (2019.2) Anki2.1 自建服务器临时解决方案及一些想法
  10. SourceTree + Gerrit