组合模式装饰器模式

1,222 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

作用:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

比如部门树结构,

public class Dept {
   private String name;
   private String parentId;
   private List<Dept> children;
   }

element中的Cascader级联选择结构

const options = [
  {
    value: 'guide',
    label: 'Guide',
    children: [
      {
        value: 'disciplines',
        label: 'Disciplines',
        children: [
          {
            value: 'consistency',
            label: 'Consistency',
          },
          {
            value: 'feedback',
            label: 'Feedback',
          },
          {
            value: 'efficiency',
            label: 'Efficiency',
          },
          {
            value: 'controllability',
            label: 'Controllability',
          },
        ],
      },
      ]
  }

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

作用:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

通常装饰类包含原类的一个对象,相当于一个wrapper类,是对原类功能的扩展

jdk中的流InputStream是一个典型的装饰器模式,其子类有

  • ByteArrayInputStream

  • FileInputStream

  • PipedInputStream

  • SequenceInputStream

  • FilterInputStream

    public class FilterInputStream extends InputStream {
        // 包含了一个原类对象
        protected volatile InputStream in;
    }
    

    Spring Wrapper

    BeanWrapper 是一个包装类接口,其实现类BeanWrapperImpl 接收一个Object对象进行包装处理。

    public BeanWrapperImpl(Object object) {
        super(object);
      }
    ​
      /**
       * Create a new BeanWrapperImpl, wrapping a new instance of the specified class.
       * @param clazz class to instantiate and wrap
       */
      public BeanWrapperImpl(Class<?> clazz) {
        super(clazz);
      }
    ​
    

装饰模式就像穿衣服,一层层的进行包装、扩展。

\