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./designpatterns/composite.htm(中文、java实例) 2、 http://www./Patterns/PatternComposite.aspx(英文、C#实例、UML) 3、 http://www./tech/DesignPattern/Composite.html(日文、java实例、UML)推荐
|