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

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

总结:

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

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

学海无涯苦作舟!!!

相关推荐
开源必胜1 小时前
Future的异常处理以及CompletableFuture传播链、异常处理
java
林森lsjs2 小时前
队列 FIFO 原理 & 手撕两种队列实现(链表 + 循环数组)—数据结构陆
java·开发语言·数据结构·队列
lisin-lee-cooper3 小时前
简单聊聊 OpenFeign 框架源码
java·微服务
Buke..3 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
linux-hzh3 小时前
百日算法修炼 · Day 15
java·算法
半生过往3 小时前
前端学 Java 课程笔记
java·前端·笔记
mmsx4 小时前
基于 Android 的校园信息管理系统源码
android·java·okhttp
Buke..4 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
竹枝溪4 小时前
Tomcat与Servlet全套小白教程
java·servlet·tomcat·cookie·filter·session·listener
UseLessQQ5 小时前
云计算k8s集群部署
java·kubernetes·云计算