GoF设计模式之八 Composite- -

来源:百度文库 编辑:神马文学网 时间:2024/04/28 15:52:46
B3) Composite(组合模式)
定义:将对象组合成树状结构来形成“部分-整体”层次。组合使得客户端同样地处理单个对象和组合对象。
组合模式在dofactory中使用频率为最高的LV5,实在是面向对象的一个经典的模式,而且树状结构是现实中除了二维表格外最常用的数据结构。举最简单的例子,有一大堆档案,通常的保管方法就是按照拼音字母分类,放在不同的档案夹中,再将所有的档案夹放入抽屉,当然,可能有些档案无非分类,就不放在档案夹中而是直接放入抽屉。如果有新的档案A,就放入A档案夹中,要找档案S,就从档案夹S中拿,而要转移所有档案,就转移整个抽屉。这样就将档案组合成档案夹,档案夹与档案再组合成抽屉,形成树状结构。电脑中存放文件(file)的方式也是如此,现在只考虑对文件的删除。文件对象如下表示:
public interface FileEntry {
public void remove();
}
public File implements FileEntry {
private String name;
public File(String name) {
this.name = name;
}
public void remove() {
System.out.println("File " + name + " has been deleted.");
}
}
文件目录(文件夹)对象
public Dir implements FileEntry {
private List files;
private String name;
public Dir(String name) {
this.name = name;
this.files = new ArrayList();
}
public void add(FileEntry fileEntry) {
files.add(fileEntry);
}
public void remove() {
Iterator itr = files.iterator();
While (itr.hasNext()) {
FileEntry fileEntry = (FileEntry)itr.next();
fileEntry.remove();
}
System.out.println("Dir " + name + " has been deleted.");
}
}
对于文件夹的操作
Dir dirRoot = new Dir("root");
Dir dirSub = new Dir("sub");
File fileA = new File("A.file");
File fileB = new File("B.file");
File fileX = new File("X.file");
File file1 = new File("1.file");
dirSub.add(fileA);
dirSub.add(fileB);
dirSub.add(fileX);
dirRoot.add(dirSub);
dirRoot.add(file1);
//delete
dirRoot.remove();
这样,所有的文件和文件夹都会被删除,这里面还用到了以前提到的Iterator模式来进行对象的遍历。还有一部分功能没有完成,现在只是对组合对象的处理,而对单个对象的处理并没有实现,就是通过dirRoot对象删除某个文件或者文件夹。由于这部分功能涉及后面要说的一个模式Chain Of Responsibility(职责链),暂时不提以免混淆,而功能将会在以后讲COR的时候补充完整。
参考:
1、http://www.jdon.com/designpatterns/composite.htm(中文、java实例)
2、http://www.dofactory.com/Patterns/PatternComposite.aspx(英文、C#实例、UML)
3、http://www.techscore.com/tech/DesignPattern/Composite.html(日文、java实例、UML)推荐