设计模式——装饰模式(Decorator)

简介: 设计模式——装饰模式(Decorator)

一、什么是装饰者模式


装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。


我们来看下装饰者模式的UML图:


image.png


装饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。


意图:动态地给一个对象添加一些额外的职责和增加功能。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。


二、装饰者模式的构成

Component(抽象构件):它是装饰类和具体构件的公共父类;


ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象;


Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责;


ConcreteDecoraror(具体装饰类):实现了抽象装饰类,它负责向构件添加新的职责;


三、实例演示

业务场景:现我们现在模拟这样一个场景,我们点了一杯奶茶,然后给奶茶中加了冰块,加了珍珠,最后我们还想再给加点红豆,这里加红豆就使用了装饰者。


我们下来创建一个奶茶的抽象类,想到于Component


public interface MilkyTea {
   public void recipe();
}


我们再来创建要给奶茶的具体子类,相当于ConcreteComponent


public class MilkyTeaA implements MilkyTea {
   @Override
   public void recipe() {
       System.out.println("老板来一杯奶茶,加冰块");
   }
}


接下来创建一个装饰类,相当于Decorator


public class Decorator implements MilkyTea {
   private MilkyTea milkyTea;
   public void setMilkyTea(MilkyTea milkyTea) {
       this.milkyTea = milkyTea;
   }
   @Override
   public void recipe() {
       milkyTea.recipe();
   }
}


创建装饰类的子类,添加珍珠,相当于ConcreteDecorator


public class MilkyTeaADecorator extends Decorator {
   @Override
   public void recipe() {
       super.recipe();
       recipeZZ();
   }
   // 加珍珠
   public void recipeZZ() {
       System.out.println("老板再加点珍珠吧");
   }
}


创建装饰者的子类,添加红豆,相当于ConcreteDecorator


public class MilkyTeaBDecorator extends Decorator {
   @Override
   public void recipe() {
       super.recipe();
       recipeHD();
   }
   public void recipeHD() {
       System.out.println("老板你再给加点红豆吧");
   }
}


最后我们测试一下看下结果:


public class Test {
   public static void main(String[] args) {
       MilkyTeaA milkyTea = new MilkyTeaA();
       MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator();
       MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator();
       milkyTeaA.setMilkyTea(milkyTea);
       milkyTeaB.setMilkyTea(milkyTeaA);
       milkyTeaB.recipe();
   }
}


image.png


四、模式总结

通过这个小例子我们可以发现,装饰者模式是为了已有的功能动态的添加更多功能的一种方式。

装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类;

目录
相关文章
|
6月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
37 0
|
6月前
|
设计模式 中间件 PHP
设计模式 | 装饰模式
设计模式 | 装饰模式
33 0
|
3月前
|
设计模式 Java
【八】设计模式~~~结构型模式~~~装饰模式(Java)
文章详细介绍了装饰模式(Decorator Pattern),这是一种对象结构型模式,用于在不使用继承的情况下动态地给对象添加额外的职责。装饰模式通过关联机制,使用装饰器类来包装原有对象,并在运行时通过组合的方式扩展对象的行为。文章通过图形界面构件库的设计案例,展示了装饰模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和应用示例。装饰模式提高了系统的灵活性和可扩展性,适用于需要动态、透明地扩展对象功能的情况。
【八】设计模式~~~结构型模式~~~装饰模式(Java)
|
6月前
|
设计模式
设计模式之装饰器 Decorator
设计模式之装饰器 Decorator
46 1
|
5月前
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
6月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
|
6月前
|
设计模式 Java
小谈设计模式(7)—装饰模式
小谈设计模式(7)—装饰模式
|
6月前
|
设计模式
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
|
6月前
|
设计模式 人工智能 移动开发
认真学习设计模式之装饰者模式(Decorator Pattern)
写在前言 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。
64 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78