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

发布于:2025-07-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

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、抽象组件

// 抽象组件
public interface Coffee {
    String getDescription();
    double getCost();
}

2、具体组件

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

3、抽象装饰器

// 抽象装饰器
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: 加糖,加牛奶,如下所示:

// 加糖
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、使用示例

如下所示:

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

输出结果:

Simple Coffee $5.0
Simple Coffee, Sugar $6.0
Simple Coffee, Sugar, Milk $8.0

3、典型应用场景

1、Java IO流

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

// 基本功能:读文件
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


网站公告

今日签到

点亮在社区的每一天
去签到