composite模式又叫做组合模式/复合模式。
它是一种能够使容器与内容具有一致性,创造出递归结构的模式。
示例程序是列出文件夹以及其内部文件与文件夹一览的功能:
可以由示例图看出,有一个电影文件夹里面有两个文件夹,一个是正常,一个是你懂得。
在正常文件夹里面有三个电影,分别是泰坦尼克号,终结者和钢铁侠。
而在你懂得文件夹里面有两部电影和一个葵司文件夹,两部电影分别是列车.avi和苍老师.avi,而葵司文件里面同样也有两部电影,家庭教师.avi和隔壁小姐姐.avi。
下面是示例代码:
- SomeThing 文件夹和文件的父类
package site.wangxin520.gof.composite; /** * 所有东西的一个父类 * @author wangXgnaw * */ public abstract class SomeThing { //名字 public abstract String getName(); //大小、所占空间 public abstract int getSize(); //输出打印自己,文件的话,就打印里面所有文件,和自己。如果是文件的话,打印自己 public abstract void print(); }
- Directroy 文件夹类
package site.wangxin520.gof.composite; import java.util.ArrayList; /** * 文件夹的类 * @author wangXgnaw * */ public class Directory extends SomeThing{ private String name; private int size; private ArrayList<SomeThing> arr; /** * 文件夹构造函数,传入文件夹名 * @param name */ public Directory(String name) { this.name=name; arr=new ArrayList<>(); } @Override public String getName() { return name; } @Override public int getSize() { size=0; for (SomeThing someThing : arr) { size+=someThing.getSize(); } return size; } /** * 递归打印出本文件夹名字和文件夹内部的文件或者文件夹的名字 */ @Override public void print() { System.out.println("文件夹名:"+name+" 大小为:"+getSize()); for (SomeThing someThing : arr) { someThing.print(); } } /** * 文件夹添加东西 * @param someThing 这里的something既可以是文件夹,又可以是文件 */ public void addSomeThing(SomeThing someThing){ arr.add(someThing); } }
- File 文件类
package site.wangxin520.gof.composite; /** * 文件类 * @author wangXgnaw * */ public class File extends SomeThing{ 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 public void print() { System.out.println("文件:"+name+"["+size+"]"); } }
- Test测试类
package site.wangxin520.gof.composite; /** * 组合模式的测试类 * @author wangXgnaw * */ public class Test { public static void main(String[] args) { Directory moive=new Directory("电影"); Directory normal=new Directory("正常的"); Directory heihei=new Directory("你懂得"); moive.addSomeThing(normal); moive.addSomeThing(heihei); normal.addSomeThing(new File("终结者.rmvb", 850)); normal.addSomeThing(new File("泰坦尼克号.rmvb", 770)); normal.addSomeThing(new File("钢铁侠.rmvb", 1200)); heihei.addSomeThing(new File("列车.avi", 3200)); Directory kuiSi=new Directory("葵司"); kuiSi.addSomeThing(new File("葵司-家庭老师.avi", 3000)); kuiSi.addSomeThing(new File("葵司-隔壁小姐姐.avi", 3000)); heihei.addSomeThing(new File("苍老师.avi", 1800)); heihei.addSomeThing(kuiSi); moive.print(); } }
- 控制台输出结果为:
文件夹名:电影 大小为:13820 文件夹名:正常的 大小为:2820 文件:终结者.rmvb[850] 文件:泰坦尼克号.rmvb[770] 文件:钢铁侠.rmvb[1200] 文件夹名:你懂得 大小为:11000 文件:列车.avi[3200] 文件:苍老师.avi[1800] 文件夹名:葵司 大小为:6000 文件:葵司-家庭老师.avi[3000] 文件:葵司-隔壁小姐姐.avi[3000]
…