设计模式-装饰者模式
结合看书和看菜鸟来说真的是一种比较好的学习方法,刚开始仅仅盯着书来学习,看的自己晕晕乎乎的。但是看完菜鸟教程的讲解以及例子之后,突然从一脸懵逼变得清醒过来。下面进行简单的整理。
简单描述:动态地将责任附加到对象上,若要扩展功能,装饰者模式提供了比继承更具有弹性的替代方案(可代替继承)
所属类型:结构性模式
适用情况:再不想增加很多子类的情况下扩展类
适用场景:1、扩展一个类的功能 2、动态增加功能,动态撤销。
实现原则:将具体功能职责划分,同时继承装饰者模式。
关键代码:Component类充当抽象角色,不应该具体实现;修饰类引用和继承Component类,具体继承类重写父类方法
这里利用菜鸟教程上的Shape的例子比较好理解。首先定义一个Shape接口类,让各个形状都来实现这个接口。代码如下所示:
package decorator; public interface Shape { public void draw(); }
package decorator; public class Circle implements Shape { @Override public void draw() { System.out.println("this is circle"); } }
package decorator; public class Rectangle implements Shape { @Override public void draw() { System.out.println("this is rectangle"); } }
接着就来创建装饰者类,我们通过装饰者来在已经创建好的圆和方形的基础上对其进行装饰。具体代码如下:
package decorator; public abstract class ShapeDecorator implements Shape { protected Shape decorateShape; public ShapeDecorator(Shape decorateShape) { this.decorateShape = decorateShape; } public void draw() { decorateShape.draw(); } }
装饰者对象已经创建好了,接着我们要进行细致的实现,也就是我们要在原先对象的基础上干什么,所以接下来创建一个RedShapeDecorator
类来为我们之前创建的形状添加Red
颜色。实现如下:
package decorator; public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decorateShape) { super(decorateShape); } @Override public void draw() { decorateShape.draw(); setBorder(); } private void setBorder() { System.out.println("Border : Red"); } }
可以看到在实例化时调用了父类的构造方法,并且调用了父类的draw
方法,随后又调用setBorder
来为形状涂色。最后看一下效果如何:
package decorator; public class DecoratorDemo { public static void main(String[] args) { Shape circle = new Circle(); circle.draw(); System.out.println("------------------"); ShapeDecorator redCircle = new RedShapeDecorator(new Circle()); redCircle.draw(); System.out.println("------------------"); ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle()); redRectangle.draw(); } }
查看一下运行结果:
this is circle ------------------ this is circle Border : Red ------------------ this is rectangle Border : Red
从结果中可以看到,我们为形状添加的颜色在不新建一个红圈类的基础上实现了,也就是给这个圈装饰上了。自我理解装饰者模式是一个层层嵌套
的方式来实现对对象的装饰效果的。
最后总结一下装饰者模式的相关要点。
Tips:
继承属于扩展形式的一种,但不是达到弹性设计的最佳方案
在设计中,应尽量允许行为可以被扩展,而无需修改现有的代码
装饰者模式意味着用一个或多个装饰者类来包装具体的类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!