1. 程式人生 > >設計模式-組合模式(Composite)

設計模式-組合模式(Composite)

 

 

組合模式是構造型模式的一種。通過遞迴手段構造樹形的物件結構,並可以通過一個物件來訪問整個物件樹

 

角色和職責:

就是資料夾那種形式,樹形

 

UML圖:

 

具體程式碼:

import java.util.List;

/**
 * Ifile 統一介面
 */
public interface Ifile {
    void display();//顯示
    boolean add(Ifile file);//新增
    boolean remove(Ifile file);//刪除
    List<Ifile> getChild();//
獲取孩子節點 }
import java.util.List;

/**
 * 檔案
 */
public class File implements Ifile{
    private String fileName;//檔名
    public File(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        System.out.println(fileName);
    }

    @Override
    public
boolean add(Ifile file) { return false; } @Override public boolean remove(Ifile file) { return false; } @Override public List<Ifile> getChild() { return null; } }
import java.util.ArrayList;
import java.util.List;

/**
 * 目錄
 */
public class
Folder implements Ifile{ private String fileName;//檔名 private List<Ifile> list = null;//目錄集合 public Folder(String fileName){ this.fileName = fileName; this.list = new ArrayList<Ifile>(); } @Override public void display() { System.out.println(fileName); } @Override public boolean add(Ifile file) { this.list.add(file); return true; } @Override public boolean remove(Ifile file) { this.list.add(file); return true; } @Override public List<Ifile> getChild() { return this.list; } }
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Ifile folder_d = new Folder("d:");
        Ifile file_d_aa = new File("aa.txt");
        Ifile folder_d_dingding = new Folder("dingding");
        Ifile folder_d_dingding_bin = new Folder("bin");
        Ifile file_d_dingding_b = new File("可執行檔案.exe");
        Ifile file_d_dingding_bin_b = new File("mm.exe");
        Ifile file_d_bb = new File("bb.txt");

        folder_d_dingding_bin.add(file_d_dingding_bin_b);

        folder_d_dingding.add(folder_d_dingding_bin);
        folder_d_dingding.add(file_d_dingding_b);

        folder_d.add(file_d_aa);
        folder_d.add(folder_d_dingding);
        folder_d.add(file_d_bb);

        show(folder_d,0);//顯示當前目錄下的節點
    }

    /**
     * 顯示當前目錄下的節點
     * @param file
     */
    public static void show(Ifile file,int deep){
        for(int m=0;m<deep;m++){
            System.out.print("--");
        }
        List<Ifile> list = file.getChild();
        for(int i = 0; i<list.size();i++){
            Ifile fi = list.get(i);
            System.out.print("--");
            if(fi instanceof  File){
                for(int n=0;n<deep-1;n++){
                    System.out.print("--");
                }
                fi.display();
            }else{
                fi.display();
                show(fi,++deep);
            }
        }
    }
}

 

優缺點:

優:

  • 可以清楚地定義分層次的複雜型別,表示物件的全部層次或者部分層次  ,它讓客戶端忽略了層次的差異,方便對整個層次經行控制
  • 客戶端可以一致的使用一個組合模式或對單個物件,不必關心處理的是單個物件還是整個組合結構,簡化了客戶端的程式碼
  • 在組合模式種增加新的容器構件和葉子構件都很方便,無需對現有類庫進行任何修改,符合開閉原則。
  • 為樹形結構的面向物件實現提供了一種靈活的解決方案,通過葉子物件和容器物件的遞迴組合可以形成複雜的樹形機構,但對樹形結構的控制卻很簡單

 

應用場景:

在一個使用面嚮物件語言開發的系統中需要處理一個樹形結構的

在一個系統中能分離出葉子和容器的,而且他們的型別還固定不變,需要增加一些新的型別

 

原始碼地址:https://github.com/qjm201000/design_pattern_composite.git