一天一個設計模式——Composite組合模式

1、模式說明java

  可以使容器與內容物具備一致性,創造出遞歸結構的模式就是Composite組合模式。設計模式

  舉個例子:計算機中的文件系統中有文件和文件夾的概念,咱們知道,文件夾能夠包含文件,也能夠包含子文件夾,子文件夾中又能夠包含文件和文件夾。若是將文件和文件夾都看做「目錄條目(Directory Entry)」,那麼文件系統就造成了一個遞歸的容器,這就是一種組合模式。ide

  更多例子,在Windows操做系統中,一個窗口中能夠包含子窗口,從而造成容器的遞歸;一條宏命令又能夠包含另外一個宏命令;一個文章章節又能夠包含多個子章節。。。這種具備樹狀結構的數據都適用於組合模式。this

2、模式類圖spa

3、代碼示例操作系統

  在示例程序中,咱們建立一個Entry目錄條目類,並讓File文件類和Dictory文件夾類去繼承它。設計

一、FileTreatementException類3d

package com.designpattern.cn.Entry;

public class FileTreatementException extends RuntimeException {
    public FileTreatementException(){

    }
    public FileTreatementException(String msg){
        super(msg);
    }
}
View Code

二、Entry條目類code

package com.designpattern.cn.Entry;

public abstract class Entry {
    public abstract String getName();
    public abstract int getSize();
    public Entry add(Entry entry) throws FileTreatementException{
        throw new FileTreatementException();
    }
    public void PrintList(){
        printList("");
    }
    protected abstract void printList(String prefix);
    public String toString(){
        return getName() + " (" + getSize() + ")";
    }
}
View Code

三、File文件類對象

package com.designpattern.cn.Entry;

public class File extends Entry {
    private String name;
    private int size;
    public File(String name, int size){
        this.name = name;
        this.size = size;
    }

    public String getName(){
        return name;
    }

    public int getSize(){
        return size;
    }

    protected void printList(String prefix){
        System.out.println(prefix + "/" + this);
    }
}
View Code

四、Directory目錄類

package com.designpattern.cn.Entry;

import java.util.ArrayList;
import java.util.Iterator;

public class Directory extends Entry {
    private String name;
    private ArrayList directory = new ArrayList();
    public Directory(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public int getSize(){
        int size = 0;
        Iterator it = directory.iterator();
        while (it.hasNext()){
            Entry entry = (Entry) it.next();
            size += entry.getSize();
        }
        return size;
    }
    public Entry add(Entry entry){
        directory.add(entry);
        return this;
    }
    protected void printList(String prefix){
        System.out.println(prefix + "/" + this);
        Iterator it = directory.iterator();
        while (it.hasNext()){
            Entry entry = (Entry) it.next();
            entry.printList(prefix + "/" + name);
        }
    }
}
View Code

五、Main方法類和運行結果

package com.designpattern.cn.Entry;

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println("Making root entries...");
            Directory rootdir = new Directory("root");
            Directory bindir = new Directory("bin");
            Directory tmpdir = new Directory("tmp");
            Directory usrdir = new Directory("usr");

            rootdir.add(bindir);
            rootdir.add(tmpdir);
            rootdir.add(usrdir);
            bindir.add(new File("vi", 10000));
            bindir.add(new File("latex", 20000));
            rootdir.printList("");
        }catch (FileTreatementException e){
            e.printStackTrace();
        }
    }
}
View Code

4、模式中的角色

  • Leaf樹葉角色:該角色中不能再放入其餘對象,如示例中的File類;
  • Composite複合物類:在其中能夠放入Leaf和Composite複合物,如示例程序中的Directory類;
  • Component類:使Leaf和Composite角色具備一致性的角色,如示例中的Entry類;
  • Client客戶角色:使用複合模式的對象。

5、相關的設計模式

  • Command模式:Command模式編寫宏命令時會使用Composite模式;
  • Vistor訪問者模式:可使用訪問者模式訪問Composite中的遞歸結構;
  • Decorator裝飾者模式:Composite模式經過Component角色使Composite和Leaf具備一致性,Decorator模式使裝飾框和內容具備一致性;
相關文章
相關標籤/搜索