浅析设计模式(复合模式(Composite))

在计算机的文件系统中,文件和文件夹可以统称为目录条目,文件夹中可以放入文件,也可以放入其他文件夹(子文件夹),而子文件夹中同样可以放入文件或是子文件夹。这样文件夹实际上形成了一种容器结构、递归结构。
有时,与将文件和文件夹都看作是目录条目一样,将容器与内容作为同一种东西看待能够帮助我们方便的处理问题
能够使"容器"与"内容"具有一致性,创造出递归结构的模式就是复合模式(Composite)。
复合模式中的角色:

  • Leaf(树叶):表示"内容"的角色,该角色中不能放入其他对象。
  • Composite(复合物):表示"容器"的角色,Composite中既可以放入Leaf,也可以放入其他Composite。
  • Component(组件):是Leaf和Composite具有一致性的角色,Component是Leaf和Composite的父类。
  • Client:使用Composite模式的角色。

复合模式的类图:
浅析设计模式(复合模式(Composite))
文章图片

我们使用Composite模式来模拟一下文件系统:
1、编写Component角色
AbstractEntity表示目录条目,它是文件和文件夹的父类。
浅析设计模式(复合模式(Composite))
文章图片


2、编写Leaf:
File类表示文件
浅析设计模式(复合模式(Composite))
文章图片


3、编写Composite角色:
Directory类表示文件夹
浅析设计模式(复合模式(Composite))
文章图片


【浅析设计模式(复合模式(Composite))】4、编写测试程序
我们来创建如下入所示的目录结构:
浅析设计模式(复合模式(Composite))
文章图片


浅析设计模式(复合模式(Composite))
文章图片


上面的代码不难理解,但是厘清Composite模式我们需要注意这几个要点:

  • 一致性:File类和Directory类都是AbstractEntity类的子类,一致性体现在什么地方?以Directory类的getSize方法为例,遍历每一个目录条目的过程中你不需要判断每一个条目具体是文件还是文件夹,实际上无论是文件还是文件夹都可以直接使用getSize方法获取其大小,只不过文件夹的getSize方法隐含了递归的过程。反过来看,若File与Directory不具备一致性,那么文件夹的getSize方法怎么实现?你需要在在目录条目遍历的过程中,判断每一个条目的类型,若是文件则直接累加其大小,若是文件夹,则再遍历其所包含的目录条目...
  • 容器结构:Directory类就是一个容器,其files属性可以存储File或其他Directory。
  • 递归结构:Directory类的getSize方法和pringList方法都隐含了递归调用的过程。
Ending ...


    推荐阅读