定义:

  • 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

特点:

  • 采用装饰模式扩展对象的功能比采用继承方式更加灵活。(优点)
  • 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。(优点)
  • 装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。(缺点)

    通常适用场景:

  • 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。

  • 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
  • 当对象的功能要求可以动态地添加,也可以再动态地撤销时。

    demo代码:

  • 原有接口功能 ```java public interface Animal{ void function(); }

public class Chicken implements Animal{ @Override public void function() { System.out.println(“咯咯哒叫和飞的功能”); } }

  1. - 新增功能
  2. ```java
  3. //抽象装饰类
  4. public class Decorator implements Animal{
  5. private Animal animal;
  6. public Decorator(Animal animal){
  7. this.animal=animal;
  8. }
  9. @Override
  10. public void function() {
  11. animal.function();
  12. }
  13. }
  14. //具体装饰类
  15. public class ChickenDecorator extends Decorator{
  16. public ChickenDecorator(Animal animal){
  17. super(animal);
  18. }
  19. @Override
  20. public void function() {
  21. super.function();
  22. newFunction();
  23. }
  24. public void newFunction(){
  25. System.out.println("会战斗的鸡");
  26. }
  27. }
  • 测试
    public static void main(String[] args) {
      Animal animal1 = new Chicken();
      animal1.function();
      System.out.println("================================");
      Animal animal2 = new ChickenDecorator(animal1);
      animal2.function();
    }