装饰器模式:让你的对象变得更强大

这篇具有很好参考价值的文章主要介绍了装饰器模式:让你的对象变得更强大。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在日常开发中,当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。这时候,我们该怎么办呢?我们可以使用装饰器器模式来解决这个问题,本文将从以下四个方面讲解装饰器器模式

  • 简介
  • 优缺点
  • 应用场景
  • 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 示例代码

  1. 定义了一个抽象组件接口 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");
    }
}
  1. 定义一个抽象装饰器类 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");
    }
}

  1. 编写装饰器模式测试代码,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 circle
Normal rectangle:
Drawing a rectangle
Red circle:
Drawing a circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

Spring 代码示例

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

  1. 给具体组件类 Circle、Rectangle 添加 @Component 注解,
@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

@Component
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}
  1. 给具体装饰器类 RedShapeDecorator 和 GreenShapeDecorator 类添加 @Component 注解,
@Component
public 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");
    }
}

@Component
public 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");
    }
}
  1. 编写 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 circle
Setting red border
Green rectangle:
Drawing a rectangle
Setting green border

总结

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

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!文章来源地址https://www.toymoban.com/news/detail-695512.html

到了这里,关于装饰器模式:让你的对象变得更强大的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5款冷门小工具,让你的电脑变得与众不同

    每个人的电脑中都会安装很多软件,可能还保留着很多不为人知的冷门软件。不过虽然冷门,但绝不意味着低能,相反很多冷门软件的功能十分出色。闲话少说,接下来我就给大家推荐5款冷门小工具,看一看有没有你喜欢的。 TileIconifier是一款用于自定义Windows 10的磁贴图标的

    2024年02月07日
    浏览(41)
  • 一文弄懂Vue与Servlet的交互:让你的大学课设变得容易起来

    目前较为流行的套装是SpringBoot+Vue。SpringBoot操作简单,仅会使用的话上手非常容易。那么小游你为何逆流而上,要写一个Vue+Servlet的交互呢? 要知道,CSDN最大的受众是学生,而且多数是大学生。就目前的形势而言,大学里的技术偏基础,有些甚至已经过时,如JSP。而有些老师

    2024年01月20日
    浏览(40)
  • 让你的网站变得更智能 - B2 Pro主题问答模块新增OpenAI ChatGPT机器人自动回答功能

    作为一个网站管理员,你一定会希望能够给你的用户提供更多、更好的服务。那么,你是否曾经想过为你的B2 Pro主题问答模块新增一个智能机器人自动回答功能呢?相信你一定想要这个功能,因为它能够大大提升你网站的用户体验。 现在,我们为你提供了一个好消息。我们已

    2024年02月09日
    浏览(54)
  • 让你的ChatGPT更加强大——200+小白用来解锁ChatGPT高级功能的提示(Prompts)

    随着 ChatGPT 受到越来越多的关注,大多数人只是将其视为一种猎奇的聊天机器人,以测试其人工智能的答案。但是,ChatGPT 不仅仅是一款娱乐工具,未来它也可能成为必要的生产手段。它之类的 AI 工具可以利用其巨大的语言知识库,为我们创造出更大的价值。 提示词(即 P

    2023年04月19日
    浏览(51)
  • 让你的ChatGPT更加强大——200+小白用来解锁ChatGPT高级功能的提示(Prompts)——即开即用-开源纯免费-实时更新

    随着 ChatGPT 受到越来越多的关注,大多数人只是将其视为一种猎奇的聊天机器人,以测试其人工智能的答案。但是,ChatGPT 不仅仅是一款娱乐工具,未来它也可能成为必要的生产手段。它之类的 AI 工具可以利用其巨大的语言知识库,为我们创造出更大的价值。 提示词(即 P

    2024年02月04日
    浏览(130)
  • 装饰器模式:动态添加功能于对象

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们在不改变对象结构的前提下,动态地给对象添加功能。这种模式通过将对象包装在装饰器类中来扩展其行为,而不是通过继承。装饰器模式在Java中常用于设计灵活的软件,尤其是在需要为对象添加额外职责时,

    2024年04月11日
    浏览(32)
  • 设计模式之策略模式:让你的代码灵活应对不同的算法

    作为一个程序员,我们经常会面临着在不同的情况下选择不同的算法来解决问题的需求。这种情况下,策略模式是一个非常有用的设计模式。在本文中,我将向你介绍策略模式的概念、结构以及如何应用这个模式来使你的代码更灵活。 策略模式是一种行为型设计模式,它允许

    2024年02月08日
    浏览(43)
  • Unity 资源插件Color Studio -- 让你的游戏对象颜色更加出彩【限时免费】

    Color Studio 是一款功能强大的 Unity 编辑器扩展,它可以让您的游戏更加丰富多彩。它提供了各种工具,可以帮助您轻松创建吸引人的调色板,编辑纹理和精灵,以及对任何游戏对象(包括蒙皮对象和精灵)重新着色。使用 Color Studio,您可以利用颜色理论来创建看起来很棒的程

    2024年04月14日
    浏览(54)
  • 【设计模式】模板方法模式--让你的代码更具灵活性与可扩展性

    在软件开发中,设计模式是一种经过实践检验的、可复用的解决方案,它们可以帮助我们解决某一特定领域的典型问题。设计模式不仅能提高代码的可读性、可维护性,还能让我们的代码更加灵活和易于扩展。在这个不断发展的技术世界中,了解并掌握设计模式对于软件开发

    2024年02月04日
    浏览(39)
  • 12、【装饰器模式】动态地为对象添加新功能

    你好,我是程序员雪球。 今天我们来聊聊 23 种设计模式中,一种常见的结构型模式,装饰器模式。聊聊它的设计思想、实现原理,应用场景,以及如何使用。     装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原始类的基础上,动态地为对象添加新的

    2024年04月29日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包