首页 / 装修知识 / 正文
对象汽车装饰,更强大变得对象模式装饰(装饰对象方法模式功能)

Time:2024年08月03日 Read: 评论:0 作者:乖囧猫

简介优缺点应用场景Java 代码示例、Spring 代码示例简介

装饰器模式(Decorator Pattern)是一种结构型设计模式,它可以在不改变现有对象的结构的情况下,动态地给对象增加一些额外的功能。
装饰器模式通过创建一个包装对象(即装饰器)来包裹真实对象,并在保持真实对象的接口不变的前提下,为其提供额外的功能。
装饰器模式可以在运行时根据需要选择不同的装饰器来组合和修改对象的行为。

Component(组件接口):所有被装饰组件及装饰器对应的接口标准,指定进行装饰的行为方法。
对应本章例程中的展示接口 Showable。
ConcreteComponent(组件实现):需要被装饰的组件,实现组件接口标准,只具备自身未被装饰的原始特性。
对应本章例程中的女生类 Girl。
Decorator(装饰器):装饰器的高层抽象类,同样实现组件接口标准,且包含一个被装饰的组件。
ConcreteDecorator(装饰器实现):继承自装饰器抽象类的具体子类装饰器,可以有多种实现,在被装饰组件对象的基础上为其添加新的特性。
对应本章例程中的粉底类 FoundationMakeup、口红类 Lipstick。

推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。
实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。
技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。
分模块设计、简洁易维护,欢迎大家点个 star、关注博主。

github 地址:https://github.com/wayn111/waynboot-mall

对象汽车装饰,更强大变得对象模式装饰(装饰对象方法模式功能)

对象汽车装饰,更强大变得对象模式装饰(装饰对象方法模式功能)
(图片来自网络侵删)
优缺点

装饰器模式的优点有:

装饰器模式是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态地给一个对象扩展功能,即插即用。
通过使用不同的装饰器及这些装饰器的排列组合,可以实现不同效果。
装饰器模式完全遵守开闭原则,可以在不修改原有代码的基础上增加新的功能。

装饰器模式的缺点有:

装饰器模式会增加许多子类,过度使用会增加程序的复杂性。
装饰器模式会增加对象之间的联系,可能会引入循环引用的问题。
装饰器模式会影响对象的标识,当使用装饰器对对象进行包装时,对象的类型和行为可能会发生变化。
应用场景

装饰器模式适用于以下场景:

当需要给一个现有的类添加附加职责,而又不能采用继承的方式时,可以使用装饰器模式。
例如,在不修改原有代码的情况下给一个窗口添加滚动条或者边框等功能。
当需要动态地给一个对象增加功能,而又需要撤销该功能时,可以使用装饰器模式。
例如,在电子商务系统中根据用户选择的不同优惠券来计算商品价格时,可以使用装饰器模式来实现。
当需要为一批兄弟类进行改装或加装功能时,可以使用装饰器模式。
例如,在一个图形界面工具箱中为多个不同的组件提供一些公共的功能时,可以使用装饰器模式来实现。
java 代码示例

以下是一个实现装饰器模式的 java 示例代码

定义了一个抽象组件接口 Shape 和两个具体组件类 Circle 和 Rectangle,

//抽象组件接口public interface Shape { void draw();}//具体组件类:圆形public class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a circle"); }}//具体组件类:矩形public class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); }}定义一个抽象装饰器类 ShapeDecorator 和两个具体装饰器类 RedShapeDecorator 和 GreenShapeDecorator,

//抽象装饰器类public abstract class ShapeDecorator implements Shape { //持有一个抽象组件对象 protected Shape shape; //构造方法 public ShapeDecorator(Shape shape) { this.shape = shape; } //调用被包装对象的方法 @Override public void draw() { shape.draw(); }}//具体装饰器类:红色装饰器public class RedShapeDecorator extends ShapeDecorator { //构造方法 public RedShapeDecorator(Shape shape) { super(shape); } //重写draw方法,在调用被包装对象的方法之前或之后添加新的功能 @Override public void draw() { //调用被包装对象的方法 super.draw(); //添加新的功能 setRedBorder(); } //定义新的功能方法 private void setRedBorder() { System.out.println("Setting red border"); }}//具体装饰器类:绿色装饰器public class GreenShapeDecorator extends ShapeDecorator { //构造方法 public GreenShapeDecorator(Shape shape) { super(shape); } //重写draw方法,在调用被包装对象的方法之前或之后添加新的功能 @Override public void draw() { //调用被包装对象的方法 super.draw(); //添加新的功能 setGreenBorder(); } //定义新的功能方法 private void setGreenBorder() { System.out.println("Setting green border"); }}编写装饰器模式测试代码,main 函数中创建了不同的组件和装饰器对象,并调用了它们的方法,

//测试类public class DecoratorPatternDemo { public static void main(String[] args) { //创建一个圆形对象 Shape circle = new Circle(); //创建一个矩形对象 Shape rectangle = new Rectangle(); //创建一个红色装饰器对象,包装圆形对象 Shape redCircle = new RedShapeDecorator(circle); //创建一个绿色装饰器对象,包装矩形对象 Shape greenRectangle = new GreenShapeDecorator(rectangle); //调用各个对象的方法,展示不同的效果 System.out.println("Normal circle:"); circle.draw(); System.out.println("Normal rectangle:"); rectangle.draw(); System.out.println("Red circle:"); redCircle.draw(); System.out.println("Green rectangle:"); greenRectangle.draw(); }}

输出结果如下:

Normal circle:Drawing a circleNormal rectangle:Drawing a rectangleRed circle:Drawing a circleSetting red borderGreen rectangle:Drawing a rectangleSetting green borderSpring 代码示例

要想再 Spring 项目中应用装饰器模式,只需对以上代码进行简单改造即可,

给具体组件类 Circle、Rectangle 添加 @Component 注解,

@Componentpublic class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); }}@Componentpublic class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); }}给具体装饰器类 RedShapeDecorator 和 GreenShapeDecorator 类添加 @Component 注解,

@Componentpublic class GreenShapeDecorator extends ShapeDecorator { // 构造方法 public GreenShapeDecorator(@Qualifier("rectangle") Shape shape) { super(shape); } // 重写draw方法,在调用被包装对象的方法之前或之后添加新的功能 @Override public void draw() { // 调用被包装对象的方法 super.draw(); // 添加新的功能 setGreenBorder(); } // 定义新的功能方法 private void setGreenBorder() { System.out.println("Setting green border"); }}@Componentpublic class RedShapeDecorator extends ShapeDecorator { // 构造方法 public RedShapeDecorator(@Qualifier("circle") Shape shape) { super(shape); } // 重写draw方法,在调用被包装对象的方法之前或之后添加新的功能 @Override public void draw() { // 调用被包装对象的方法 super.draw(); // 添加新的功能 setRedBorder(); } // 定义新的功能方法 private void setRedBorder() { System.out.println("Setting red border"); }}编写 Spring 项目测试代码,

@SpringBootTest@RunWith(SpringRunner.class)public class DecoratorTest { // 从Spring容器中获取Context对象 @Autowired private RedShapeDecorator redCircle; @Autowired private GreenShapeDecorator greenRectangle; @Test public void test() { System.out.println("Red circle:"); redCircle.draw(); System.out.println("Green rectangle:"); greenRectangle.draw(); }}

输出结果如下:

Red circle:Drawing a circleSetting red borderGreen rectangle:Drawing a rectangleSetting green border总结

装饰器模式可以将不同功能的单个模块规划至不同的装饰器类中,各装饰器类独立自主,各司其职。
客户端可以根据自己的需求自由搭配各种装饰器,每加一层装饰就会有新的特性体现出来,巧妙的设计让功能模块层层叠加,装饰之上套装饰,最终使原始对象的特性动态地得到增强。

关注我每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!

标签: 装饰  对象 
关于我们
我们成立于2024年夏,是给广大网友提供生活知识的平台,非盈利性质平台,主为广大网友交流分享生活当中的一些生活技巧,知识类的经验交流。
关于我们
主体介绍
扫码关注
技术支持:元老 QQ:97093008琼ICP备2024031771号-11