设计模式之装饰器模式

简介: 本篇文章是设计模式专题的第七篇文章,我会将遇到的设计模式都一一总结在该专题下,我会把自己对每一种设计模式的感悟写下来,以及在实际工作中我们该如何去灵活应用这些设计模式,欢迎大家关注。本篇文章我们就来讲一讲,以更加优雅的方式扩展类的装饰器模式。

装饰器模式的简单介绍

装饰器模式就是在不改变类原有结构的情况下,动态的对类进行扩展的一种设计模式。

这里我们就可以把原有类看做是毛坯房,装饰过的类是商品房。

装饰器模式的类图:

image.png

装饰器模式的各个角色:

  • 抽象构件(Component):这里我们可以将其看做是毛坯房。
  • 具体构件(ConcreteComponent):这里我们可以将其看做是具体的一个毛坯房。
  • 抽象装饰者(Decorator):这里我们可以将其看做是商品房。
  • 具体的装饰者(ConcreteDecorator):这里我们可以将其看做是采用了某种具体设计的商品房。

装饰器模式的具体实现思路

  • 创建抽象构件。
  • 创建抽象构件的具体实现。
  • 创建抽象的装饰者。
  • 创建具体的装饰者。

装饰器模式的具体实现方案

// 抽象构件
public abstract class Component{
    
    public abstract void operation();
}
// 具体构件
public class ConcreteComponent extends Component{
    
    @Override
    public void operation(){
        // do something ...
    }
}
// 抽象的装饰者
public abstract class Decorator extends Component{
    
    protected Component component;
    
    public Decorator(Component component){
        this.component = component;
    }
    @Override
    public void operation(){
        this.component.operation();
    }
}
// 具体的装饰者
public class ConcreteDecorator extends Decorator{
    
    // 扩展的属性
    private Object addField;
    
    public ConcreteDecorator(Component component){
        super(component);
    }
​
    // 扩展的方法
    private void addMethod(){
        // do somethind ... 
    }
​
    // 定义自己的修饰逻辑
    private void decorateMethod(){
        // do somethind ... 
    }
    
    // 重写父类的方法
    public void operation(){
        this.decorateMethod();
        super.operation();
    }
}

装饰器模式的优缺点

优点

  • 通过装饰器对类进行扩展,比通过继承对类进行扩展更加的灵活;
  • 装饰类和被装饰类相互独立,耦合度较低;

缺点

  • 没有继承结构清晰;
  • 包裹层数较多时,难以理解和排查问题;

装饰器模式的适用场景

  1. 需要动态的对对象的功能进行扩展;
  2. 不能或者不便以子类的方式扩展功能,可以代替继承;
  3. 可以用来限制对象的执行条件,也可以进行参数控制和检查等;

装饰器模式总结

学完装饰器模式,想必最让大家困惑的就是装饰器模式与代理模式的区别,他们都是让我可以对类的功能进行增强,扩展。那么我们如何很好的去区分代理模式与装饰器模式呢?代理模式是创建型模式,本质上是在创建类的时候就创建的是代理类,在类创建时就对方法进行了增强;装饰器模式是结构型模式,我们创建对象创建的还是原始对象,就比如我们买房买到的是毛坯房,当我们需要入住,就需要对其进行装饰,将毛坯房传入装饰者模式就能获取到装修过的房子。

目录
相关文章
|
5月前
|
设计模式 存储 缓存
聊聊Java设计模式-装饰器模式
装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。
57 1
聊聊Java设计模式-装饰器模式
|
5月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
56 2
|
5月前
|
设计模式
设计模式之装饰器模式
设计模式之装饰器模式
|
5月前
|
设计模式
设计模式-装饰器模式
设计模式-装饰器模式
|
10天前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
19 0
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
55 1
|
1月前
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
|
4月前
|
设计模式 Java
Java设计模式:深入装饰器模式的三种写法(六)
Java设计模式:深入装饰器模式的三种写法(六)
|
4月前
|
设计模式 架构师 安全
设计模式第五讲-装饰器模式和代理模式详解
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
248 0
|
5月前
|
设计模式 传感器 数据处理
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀
装饰器模式是一种设计模式,它允许在运行时向对象添加额外的职责,而无需修改其代码。这种模式提供了一种动态扩展对象功能的方法,同时保持了对象的单一职责原则。本文介绍了装饰器模式的基本概念、原理、优势、适用场景、实现方法、最佳实践和注意事项。通过装饰器模式,可以将多个行为组合成一个更复杂的行为,而无需使用继承或大量的接口实现。装饰器模式适用于需要对一个对象进行一系列的增强处理的情况,而这些增强处理可以以一种松耦合的方式进行组合。通过使用装饰器模式,可以提高代码的可维护性、可扩展性和灵活性,使系统更加灵活和易于维护
114 1
探索设计模式的魅力:为什么你应该了解装饰器模式-代码优化与重构的秘诀