设计模式——装饰模式(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


四、模式总结

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

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

目录
相关文章
|
1月前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
12 0
|
4月前
|
设计模式 中间件 PHP
设计模式 | 装饰模式
设计模式 | 装饰模式
17 0
|
6月前
|
设计模式
设计模式系列教程(12) - 装饰模式
设计模式系列教程(12) - 装饰模式
16 0
|
7月前
|
设计模式 算法 uml
结构型设计模式01-装饰模式
结构型设计模式01-装饰模式
16 0
|
7月前
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
15 0
|
18天前
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
|
5月前
|
设计模式 人工智能 移动开发
认真学习设计模式之装饰者模式(Decorator Pattern)
写在前言 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。
22 0
|
5月前
|
设计模式 容器
设计模式之装饰模式(2)--有意思的想法
设计模式之装饰模式(2)--有意思的想法
|
5月前
|
设计模式
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
设计模式之装饰模式--优雅的增强
|
7月前
|
设计模式 Java 数据库连接
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能