java 设计模式之装饰器模式学习

简介: java 设计模式之装饰器模式学习

装饰器模式

介绍

装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使

用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

装饰器UML图如下

3.png1、 组件(component): 定义了全部组件类和装饰器类的行为。

2、装饰器抽象类(decorator):实现了component接口的抽象类,封装了一个被修饰的component对象。

3、组件实现类(ConcreteComponent): 实现 Component 接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的

4、具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能

代码实现

假如有这么一个需求,你女朋友想要和红豆奶茶,然后她还想喝珍珠奶茶,还想要燕麦的,总不能点三杯把,这个时候装饰器模式就用上了。

代码如下:

组件类 MilkyTea:

/**
 *  组件:定义了全部组件类和装饰器实现的行为
 */
public interface MilkyTea {
    /**
     *  喝奶茶
     */
    String drink();
}

装饰器抽象类 MilkyTeaDecorator:

public abstract class MilkyTeaDecorator implements MilkyTea{
    private MilkyTea milkyTea;
    public MilkyTeaDecorator(MilkyTea milkyTea) {
        this.milkyTea = milkyTea;
    }
    @Override
    public String drink() {
        return milkyTea.drink();
    }
}

组件实现类 RedBeanMilkyTea :

/**
 * 组件实现类
 */
public class RedBeanMilkyTea implements MilkyTea {
    @Override
    public String drink() {
        return "红豆奶茶 ";
    }
}

具体装饰器类:

public class AddPearl extends MilkyTeaDecorator{
    public AddPearl(MilkyTea milkyTea) {
        super(milkyTea);
    }
    @Override
    public String drink() {
        return super.drink() + " + 珍珠";
    }
}


public class AddOat extends MilkyTeaDecorator{
    public AddOat(MilkyTea milkyTea) {
        super(milkyTea);
    }
    @Override
    public String drink() {
        return super.drink()+" + 麦片";
    }
}

测试类:

public class MilkTeaDemo {
    public static void main(String[] args) {
        MilkyTea redBean = new RedBeanMilkyTea();
        // 加燕麦
        redBean = new AddOat(redBean);
        System.out.println(redBean.drink());
        // 加奶茶
        redBean = new AddPearl(redBean);
        System.out.println(redBean.drink());
    }
}

结果:

红豆奶茶  + 麦片
红豆奶茶  + 麦片 + 珍珠

总结

装饰器相对于继承,装饰器模式灵活性更强,扩展性更强:

1、灵活性:装饰器模式将功能切分成一个个独立的装饰器,在运行期可以根据需要动态的添加功能,甚至对添加的新功能进行自由的组合;

2、扩展性:当有新功能要添加的时候,只需要添加新的装饰器实现类,然后通过组合方式添加这个新装饰器,无需修改已有代码,符合开闭原则;


能力有限,水平一般,如有错误,请多指教


目录
相关文章
|
2月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
40 0
|
6天前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
97 43
Java学习十六—掌握注解:让编程更简单
|
19天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
29天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
33 4
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
39 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
50 0
[Java]23种设计模式
|
1月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。