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

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

总结:

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

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

学海无涯苦作舟!!!

相关推荐
码农娟13 小时前
Hutool XML工具-XmlUtil的使用
xml·java
草青工作室13 小时前
java-FreeMarker3.4自定义异常处理
java·前端·python
java1234_小锋13 小时前
Java中读写锁的应用场景是什么?
java·开发语言
闻哥13 小时前
从 AJAX 到浏览器渲染:前端底层原理与性能指标全解析
java·前端·spring boot·ajax·okhttp·面试
「QT(C++)开发工程师」13 小时前
C++ 多种单例模式
java·c++·单例模式
短剑重铸之日13 小时前
《SpringCloud实用版》统一认证授权:Spring Authorization Server + OAuth2 + JWT 生产级方案
java·后端·spring·jwt·oauth2
哲-哲13 小时前
WVP+ZLM搭建碰到问题
java
编程彩机13 小时前
互联网大厂Java面试:从Spring Cloud到分布式事务的技术场景解析
java·spring cloud·微服务·消息队列·分布式事务
黎雁·泠崖14 小时前
Java内部类与匿名内部类:定义+类型+实战应用
java·开发语言
青槿吖14 小时前
第二篇:JDBC进阶骚操作:防注入、事务回滚、连接池优化,一篇封神
java·开发语言·jvm·算法·自动化