GoF设计模式之八 Composite- -1

来源:百度文库 编辑:神马文学网 时间:2024/03/29 06:56:18

 

                                      

    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)推荐