Composite模式(组合设计模式)

 在计算机的文件系统中,有“文件夹”的概念(在有些操作系统(Linux操作系统)中,也称为“目录”)。文件夹里面既可以放入文件,也可以放入其他文件夹(子文件夹)。在子文件夹中,一样地既可以放入文件,也可以放入子文件夹。可以说,文件夹是形成了一种容器结构、递归结构。

  • 结构模式:能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式。

  • 关注点:使用Composite模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当作一个对象进行处理。

理清职责

  • 到处存在的递归结构:
  1. 在视窗系统中,一个窗口可以含有一个子窗口,
    2.在文章的列表中,各列表之间可以相互嵌套,这也是一种递归结构。
    3.将多条计算机命令合并为一条宏命令时,如果使用递归结构实现宏命。
    4.树结构的数据结构都适用Composite模式。
  • 实现:演示文件夹 文件子项之间的层次关系
    名字===================>>>说明
    Entry || 抽象类,用来实现File类和Directory类的一致性
    File || 表示文件的类
    Directory || 表示文件夹的类
    FileTreatementException || 表示向文件中增加Entry时发生的异常的类
    Main || 测试程序行为的类

  • Add()方法的存在位置:
  1. 存在Entry 抛出异常。
  2. 存在Entry 中什么也不做。
  3. 声明在Entry中为抽象方法 不去实现。
  4. 直接定义在Directory类中,但是需要关注类型之间的转换。

UML

类图:

Code

  • Entry

···

public abstract class Entry {

/**  * 1. 文件名  * 2. 文件大小  * @return  */ public abstract String getName(); public abstract int getSize();  /**  * Directory  增加条目  * File 不能增加条目  */ public Entry add(Entry entry)throws FileTreatementException{     throw new FileTreatementException(); }  public void printList(){     printList(""); }  protected abstract void printList(String prefix);  @Override public String toString() {     return getName()+"("+getSize()+")"; }

}

···

  • File
public class File extends Entry {      private String name;      private int size;      public File(String name, int size) {         this.name = name;         this.size = size;     }      @Override     public String getName() {         return name;     }      @Override     public int getSize() {         return size;     }      @Override     protected void printList(String prefix) {         System.out.p
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信