设为首页 加入收藏

TOP

装饰器模式:让你的对象变得更强大(一)
2023-09-09 10:25:50 】 浏览:48
Tags:强大

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

  • 简介
  • 优缺点
  • 应用场景
  • 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();
        //创建一个红色装
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java~掩码的应用 下一篇短信发送+实现高并发下高可用(HT..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目