Java设计模式之<装饰器模式>

目录

1、定义介绍

1.1、定义

1.2、装饰器模式结构图

2、实现

1、抽象组件

2、具体组件

3、抽象装饰器

4、具体装饰器

5、使用示例

3、典型应用场景

4、优缺点


前言

java常用的设计模式分类:创建型、结构型行为型

分类如下:

装饰器模式(Decorator Pattern)是结构型设计模式之一

从之前介绍代理模式,装饰器模式和代理模式的区别如下:

代理是全权代理,目标根本不对外,全部由代理类来完成;

装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用。
装饰器模式强调的是:增强、新增行为

代理模式强调的是:对代理的对象施加控制,但不对对象本身的功能进行增强
装饰器模式:生效的对象还是原本的对象;

代理模式:生效的是新的对象(代理对象)


1、定义介绍

1.1、定义

它的核心思想是:不改变原有类的情况下,动态地给对象扩展功能,并且扩展后的对象依然可以替换原有对象(遵循开闭原则)

关于开闭原则的介绍:Java语言的设计原则_java设计原则-CSDN博客文章浏览阅读804次,点赞18次,收藏25次。这些原则旨在提高代码的重用性、可读性、可扩展性和可靠性,实现高内聚、低耦合的程序设计。避免继承导致的类层级复杂、代码冗余和耦合度高。总结:代码设计原则的核心思想。("不要和陌生人说话")。_java设计原则https://blog.csdn.net/weixin_50055999/article/details/148061298?spm=1011.2415.3001.5331

1.2、装饰器模式结构图

  • 抽象组件(Component):定义对象的接口。
  • 具体组件(ConcreteComponent):被装饰的原始对象。
  • 抽象装饰器(Decorator):实现组件接口,持有一个组件的引用。
  • 具体装饰器(ConcreteDecorator):扩展功能,并委托给原始对象。

2、实现

以咖啡和调料为例(经典例子):

1、抽象组件

java 复制代码
// 抽象组件
public interface Coffee {
    String getDescription();
    double getCost();
}

2、具体组件

java 复制代码
// 具体组件
public class SimpleCoffee implements Coffee {
    @Override
    public String getDescription() {
        return "Simple Coffee";
    }
    @Override
    public double getCost() {
        return 5.0;
    }
}

3、抽象装饰器

java 复制代码
// 抽象装饰器
public abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }

    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }

    @Override
    public double getCost() {
        return decoratedCoffee.getCost();
    }
}

4、具体装饰器

eg: 加糖,加牛奶, 如下所示:

java 复制代码
// 加糖
public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", Sugar";
    }

    @Override
    public double getCost() {
        return super.getCost() + 1.0; // 加1元
    }
}

// 加牛奶
public class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", Milk";
    }

    @Override
    public double getCost() {
        return super.getCost() + 2.0; // 加2元
    }
}

5、使用示例

如下所示:

java 复制代码
public class DecoratorDemo {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        System.out.println(coffee.getDescription() + " $" + coffee.getCost());

        // 加糖
        coffee = new SugarDecorator(coffee);
        System.out.println(coffee.getDescription() + " $" + coffee.getCost());

        // 再加牛奶
        coffee = new MilkDecorator(coffee);
        System.out.println(coffee.getDescription() + " $" + coffee.getCost());
    }
}

输出结果:

bash 复制代码
Simple Coffee $5.0
Simple Coffee, Sugar $6.0
Simple Coffee, Sugar, Milk $8.0

3、典型应用场景

1、Java IO流

(InputStream/OutputStream/Reader/Writer) 就是装饰器模式的标准实践。

java 复制代码
// 基本功能:读文件
InputStream in = new FileInputStream("a.txt"); 
// 装饰:加缓冲                 
InputStream bin = new BufferedInputStream(in);
 // 装饰:支持读基本类型                  
InputStream din = new DataInputStream(bin);                    
  • 需要"动态地"增加或者撤销对象的某些功能的时候。

4、优缺点

1、优点:

  • 比继承更灵活(不会导致类爆炸式增长)
  • 可以动态地扩展功能,互不干扰

2、缺点:

  • 系统中会产生许多小对象,理解和调试略复杂

总结:

对比策略模式、装饰器模式、适配器模式的区别:


参考文章:

1、装饰器模式详解-CSDN博客文章浏览阅读2.1w次,点赞46次,收藏189次。设计模式之装饰器模式详解文章目录设计模式之装饰器模式详解一、什么是装饰者模式二、门面模式的角色组成四、门面模式示例五、门面模式优缺点一、什么是装饰者模式装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。二、门面模式的角色组成外观角色(Facade): _装饰器模式https://blog.csdn.net/weixin_45538589/article/details/120808658?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522af95fe72372b8ed61228390452e20e16%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=af95fe72372b8ed61228390452e20e16&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120808658-null-null.142^v102^control&utm_term=%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

相关推荐
都叫我大帅哥9 分钟前
Java PriorityQueue:小顶堆大智慧,优先队列全揭秘
java
都叫我大帅哥14 分钟前
TOGAF实施治理阶段:你的项目守护神,还是架构警察?
java
吹个口哨写代码23 分钟前
防止包含 XSS 攻击风险的内容提交成功
java·服务器·前端
hrrrrb40 分钟前
【Spring Boot 快速入门】一、入门
java·spring boot·后端
超级小忍2 小时前
Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)
java·spring boot·后端
麦兜*2 小时前
基于Spring Boot的审计日志自动化解决方案,结合SpEL表达式和AOP技术,实现操作轨迹自动记录,并满足GDPR合规要求
java·jvm·spring boot·后端·spring·spring cloud·maven
青云交3 小时前
Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
java·大数据·机器学习·信用评级·动态风控·跨境金融·小贷风控
云中飞鸿5 小时前
结合项目阐述 设计模式:单例、工厂、观察者、代理
设计模式
二哈喇子!6 小时前
若依【(前后端分离版)SpringBoot+Vue3】
java·spring boot·后端
Monkey-旭9 小时前
Android Handler 完全指南
android·java·handler