概述:作为ios常用设计模式之一,它是个啥?怎么用?啥时候用?希望这篇文章能给你一些启发。
一、是个啥?
还记得上学老师讲课,听得我昏昏欲睡
于是我就睡了。。。
醒来,已经是在布置作业下课了,作为一个有骨气的人,作业我要自己写!于是打开书本:
能不能有句人话啊!
网上搜了一下大佬们的文章,写得好好好!就是我啥也没看明白。。。感觉想要说明的东西太细了,反而让我这种脑容量不够的没法找到线头整理。
只能出动杀手锏ChatGPT!来!
我大脑开始飞速旋转,对比大佬和书本内容,我悟了!
所谓装饰模式,其思想核心就是:动态地为已有模块进行新赋能,让老树发新芽啊!
这个和继承相比,两者都是在扩展类的职能,但装饰模式是往老树上挂东西,而继承则是长了颗基因相似的新树。
还不是很理解,可以看看怎么用。
二、怎么用?
123,上代码:
IComponent(接口,包含装饰器需要实现的基础方法)
Decorator(抽象类装饰器,继承IComponent。拥有一个component,构造时,需要传入IComponent,对component赋值。调用基础方法时,实际是调用传入的icomponent的基础方法)
具体装饰器(继承装饰器)
构造方法传入icomponent,并在调用自己的基础方法是优先调用传入的icomponent的基础方法
ConcreteComponent(继承icomponent,被修饰的老树)
使用:
1.生成老树ConcreteComponent
2.增加装饰A,生成一个A,构造时将老树传进去
3.增加装饰B,生成一个B,构造时将A传进去
4.调用B的基础方法
得到输出:老树的log,A的log,B的log
总结:装饰模式的实现,其实就是依靠装饰器一层一层传递、调用,一旦装饰完成,调用最外层就会传递调用内层。达到扩展功能,而无需影响原本代码的目的。
至此 已成艺术!
三、啥时候用?
装饰模式基本已经了然了,啥时候应用,在哪用?
看看ChatGPT咋说:
一个我都不清楚啊,理解不了一点。
还是看看人类大佬怎么说:
明白了!只要是需求动态扩展类职能的场景都可以应用,完全不需要具体局限。它提供了一种程序设计思路。
ok,最后说明一下它的优缺点,供大家使用时参考:
装饰者模式优点 :
① 扩展灵活 : 使用装饰者模式 , 比继承更加灵活 ; 使用装饰者模式扩展类功能 , 不会改变原来的类 ;
② 排列组合 : 对装饰类进行各种排列组合 , 可实现不同的扩展功能 ;
③ 开闭原则 : 装饰者模式符合开闭原则 , 被装饰的类 , 和装饰类相互独立 , 互不干扰 ;
装饰者模式缺点 :
① 程序复杂 : 需要编写更多的代码 , 生成更多的类 , 程序的复杂性增加了 ;
② 动态 / 多层 装饰 : 动态 / 多层 装饰一个类时 , 程序更复杂