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);
    }

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

总结:

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

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

学海无涯苦作舟!!!

相关推荐
llwszx1 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
Small black human1 小时前
设计模式-应用分层
设计模式
云泽野2 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person2 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜3 小时前
java异常学习
java
FrankYoou4 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*4 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了5 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来5 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
weixin_478689765 小时前
十大排序算法汇总
java·算法·排序算法