【设计模式】Java设计模式 - 装饰者模式

简介: 装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活。他允许对一个对象进行添加新的功能,但不能改变结构。
😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 一个有梦有戏的人 @怒放吧德德
🌝分享学习心得,欢迎指正,大家一起学习成长!

java设计模式2.jpg

简介

装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活。他允许对一个对象进行添加新的功能,但不能改变结构。

装饰者模式实例

德德奶茶店里有许多种奶茶,奶茶还能根据自己的喜欢添加额外的料。加入奶茶有很多种,料也有很多,要求既能够在扩展奶茶种类的时候,改动方便,不能改变结构。使用面向对象的方式计算不同种类奶茶的费用。用户可以只买不加料,也可以买奶茶再根据自己的喜好加料。

既想实现需求,又不能让类太繁重,又要做到高扩展,改动方便。于是就使用了装饰者模式,简单说一下如何使用装饰者首先需要一个抽象类,里面除了价格等属性,还需要有个能够让子类实现的抽象方法来计算费用。具体的奶茶再来继承这个抽象类,实现其方法并设置初始值。还需要定义总体装饰者,他是继承了抽象类,采用组合的方式,计算总价格,其他真正地装饰者也就是调料,他们再去继承这个总体装饰者。使用的使用只要实例化父类,对象为具体的奶茶类型,在加料的时候,只需要把这杯奶茶送到装饰者上,去让装饰者装饰,最后返回还是这个父类。
具体的类图如下

image.png

接下来一步一步编写代码来实现买一杯 红豆奶茶 + 牛奶 + 布丁

①、抽象类

定义饮料-抽象类,包含描述和费用两个属性,还有个抽象方法-计算价格,提供给子类去实现。

package com.lyd.demo.drink;
/**
 * @Author: lyd
 * @Description: 饮料-抽象类
 * @Date: 2022-08-29
 */
public abstract class Drink {
    private String describe; // 描述
    private float price = 0.0f;
    public String getDescribe() {
        return describe;
    }
    public void setDescribe(String describe) {
        this.describe = describe;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    // 计算费用 - 抽象 - 子类实现
    public abstract float cost();
}

②、定义单体类

定义奶茶类,只需要继承饮料类,并且获取父类的价格。

package com.lyd.demo.drink;
/**
 * @Author: lyd
 * @Description: 奶茶类
 * @Date: 2022-08-29
 */
public class MilkTea extends Drink {
    @Override
    public float cost() {
        return super.getPrice();
    }
}

③、定义具体奶茶

红豆奶茶和珍珠奶茶的代码相似,这里只粘贴红豆奶代码。具体奶茶,要设置描述和单价。

package com.lyd.demo.drink;
/**
 * @Author: lyd
 * @Description: 红豆奶茶
 * @Date: 2022-08-29
 */
public class RedBeanMilkTea extends MilkTea {
    public RedBeanMilkTea() {
        setDescribe(" 红豆奶茶 ");
        setPrice(7.0f);
    }
}

④、定义装饰类

总体装饰者,继承饮料类

package com.lyd.demo.decorator;
import com.lyd.demo.drink.Drink;
/**
 * @Author: lyd
 * @Description: 装饰者
 * @Date: 2022-08-29
 */
public class Decorator extends Drink {
    Drink drink;
    public Decorator(Drink drink) { // 组合
        this.drink = drink;
    }
    @Override
    public float cost() {
        // 计算价格综合
        return super.getPrice() + drink.cost();
    }
    @Override
    public String getDescribe() {
        return drink.getDescribe() + " + " + super.getDescribe() + " " + super.getPrice();
    }
}

⑤、定义具体装饰者

具体装饰者就是要添加的料,这里只粘贴单个代码示例,其他相似。

package com.lyd.demo.decorator;
import com.lyd.demo.drink.Drink;
/**
 * @Author: lyd
 * @Description: 装饰器 - 牛奶
 * @Date: 2022-08-29
 */
public class Milk extends Decorator {
    public Milk(Drink drink) {
        super(drink);
        setDescribe(" 牛奶 ");
        setPrice(3.0f);
    }
}

⑥、测试实例

买一杯 红豆奶茶 + 牛奶 + 布丁。
通过父类实例化具体的奶茶子类,调用其计算总价方法;要是需要加料,只要把奶茶实例放到new调料实例中,让装饰者去装饰这个类,最后返回也是饮料类。通过层层套入装饰的方式就实现了装饰者模式。在此,如果是买第二杯奶茶,只需要在new一个对应奶茶的实例。如果还有额外的品种奶茶需要添加,只要继续添加xx奶茶类,不会改变结构,或者是需要添加调料,也是如此操作,让其多个具体的装饰者。

package com.lyd.demo.test;
import com.lyd.demo.decorator.Milk;
import com.lyd.demo.decorator.Pudding;
import com.lyd.demo.drink.Drink;
import com.lyd.demo.drink.PearlMilkTea;
/**
 * @Author: lyd
 * @Description: 测试类
 * @Date: 2022-08-29
 */
public class DecorateTest {
    public static void main(String[] args) {
        // 买一杯 红豆奶茶 + 牛奶 + 布丁
        // 实例化为父类对象,红豆奶茶
        Drink pearlMilkTea = new PearlMilkTea();
        // 先观察红豆奶茶的输出
        System.out.println("您购买了: " + pearlMilkTea.getDescribe());
        System.out.println("您购买的费用: " + pearlMilkTea.cost());
        // 添加牛奶之后
        System.out.println("添加牛奶之后");
        pearlMilkTea = new Milk(pearlMilkTea);
        System.out.println("您购买了: " + pearlMilkTea.getDescribe());
        System.out.println("您购买的费用: " + pearlMilkTea.cost());
        // 再添加布丁之后
        System.out.println("再添加布丁之后");
        pearlMilkTea = new Pudding(pearlMilkTea);
        System.out.println("您购买了: " + pearlMilkTea.getDescribe());
        System.out.println("您购买的费用: " + pearlMilkTea.cost());
    }
}

运行结果:
image.png

好文推荐

👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

看过百遍,还不如动手一遍,动手敲敲代码有助于理解,设计模式不是很容易就理解,需要动手尝试,这样不仅能够学会设计模式,更能够更好的理解java面向对象。

相关文章
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
295 35
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
255 8
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
294 0
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
260 2
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
4月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
7月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
171 0
|
7月前
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
170 8
|
9月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。

热门文章

最新文章