Java设计模式 _结构型模式_装饰器模式

一、装饰器模式

1、装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式。允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2、实现思路

(1)、定义实体的抽象类或接口(如:饮料抽象类)。

(2)、实例实体类,实现抽象类(如:奶茶,果茶)。

(3)、定义装饰抽象类,需要实现抽象类,同时定义包含抽象类的成员属性(如:配料)

(4)、定义装饰抽象类的实体类(如:珍珠,可可,椰果等)

(5)、通过装饰类创建原对应的引用。

二、代码示例

1、代码示例

java 复制代码
// 饮料,抽象类
@Data
public abstract class Beverage {
    protected String name;
    protected double price;
}
// 奶茶,饮料的实现类1
public class MilkTea extends Beverage {
    @Override
    public String getName() {
        return "奶茶";
    }

    @Override
    public double getPrice() {
        return 3.5;
    }
}
// 果茶,饮料的实现类2
public class FruitTea extends Beverage {
    @Override
    public String getName() {
        return "果茶";
    }

    @Override
    public double getPrice() {
        return 2;
    }
}
// 装饰抽象类,需要实现且包含饮料属性
public abstract class Batching extends Beverage {
    protected Beverage beverage;
}
// 珍珠,装饰类的实现类1
public class Pearl extends Batching {
    public Pearl(Beverage beverage){  // 通过构造方法封装实现的饮料实体类,也可以自定义方法封装
        this.beverage = beverage;
    }
    @Override
    public String getName() {
       return  "珍珠"+beverage.getName();
    }
    @Override
    public double getPrice() {
        return 1.5+beverage.getPrice();
    }
}
// 可可,装饰类的实现类2
public class Coco extends Batching{
    public Coco(Beverage beverage){
        this.beverage = beverage;
    }
    @Override
    public String getName() {
        return  "可可"+beverage.getName();
    }
    @Override
    public double getPrice() {
        return 2+beverage.getPrice();
    }
}
// 测试
public static void main(String[] args) {
        Beverage drink = new MilkTea();
        System.out.println(drink);
        drink = new Coco(new MilkTea());
        System.out.println(drink);
    }

运行结果:可以看出可以直接生成奶茶类,也可以生成带配料的奶茶类。当然可以通过工厂模式对创建的过程在进一步封装。

总结:

定义的装饰类为抽象类,需要实现原抽象类且包含原抽象类的成员属性。通过构造或者自定义的方法,将原实体对象放入装饰类的实体中,这样通过装饰类就可以获取原对象处理后的实体类。

代码套路和适配器模式比较类似,适配器模式相当于对原功能的转接,装饰者模式相当于对原功能的进一步加强。

学海无涯苦作舟!!!

相关推荐
维天说18 分钟前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19941 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充2 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充2 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品2 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘2 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记2 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵3 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室4 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发