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

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

总结:

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

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

学海无涯苦作舟!!!

相关推荐
XiaoLeisj37 分钟前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck39 分钟前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei39 分钟前
java的类加载机制的学习
java·学习
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7893 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java4 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~4 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
程序媛小果4 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot