組合模式又稱合成模式,是用來描述部分與整體關係的一種設計模式。它的定義是:將物件組合成樹形結構以表示「部分-整體」的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。
組合模式中的幾個角色:
(1)component抽象構件
定義參加組合物件的共有方法和屬性,可以定義一些預設的行為或屬性。
(2)leaf葉子構件
葉子物件,其下再也沒有其他的分支,也就是遍歷的最小單位。
(3)composite樹枝構件
樹枝物件,它的作用是組合樹枝節點和葉子節點形成乙個樹形結構。
抽象構件

public abstract class component

}
樹枝構件

public class composite extends component 
//刪除乙個葉子構件或樹枝構件
public void remove(component component) 
//獲得分支下的所有葉子構件和樹枝構件
public arraylistgetchildren()

}
葉子構件

public class leaf extends component 
*/
}
場景類

public class client 
//通過遞迴遍歷樹
public static void display(composite root) else 
}
}
}
一棵樹形機構中的所有節點都是component,區域性和整體對呼叫者來說沒有任何區別。也就是說,高層模組不必關心自己處理的是單個物件還是整個組合結構,簡化了高層模組的**。
如果想增加乙個樹枝節點、樹葉節點是不是都很容易,只要找到它的父節點就行了。非常容易擴充套件,符合開閉原則,對以後的維護非常有利。
直接使用了實現類,與依賴倒轉原則衝突。
只要是樹形結構,就要考慮使用組合模式。
組合模式有兩種不同的實現:透明模式和安全模式。
它是把樹枝節點和樹葉節點徹底分開,樹枝節點單獨擁有用來組合的方法。這種方法比較安全,我們通常使用的就是這種模式。
它是把組合使用的方法放在抽象類中,不管葉子物件還是樹枝物件都有相同的結構。通過判斷是getchildren的返回值確定是葉子節點還是樹枝節點。
這種模式如果處理不當,會在執行期出現問題。因此不建議使用這種方式。
抽象構件

public abstract class component 
//增加乙個葉子構件或樹枝構件
public abstract void add(component component);
//刪除乙個葉子構件或樹枝構件
public abstract void remove(component component);
//獲得分支下的所有葉子構件和樹枝構件
public abstract arraylistgetchildren();

}
葉子構件
public class leaf extends component 
@deprecated
public void remove(component component)throws unsupportedoperationexception 
@deprecated
public arraylistgetchildren()throws unsupportedoperationexception

}
加deprecated註解的作用:在編譯器期告訴呼叫者,該方法已經失效,可能會出現錯誤,在執行期也會丟擲unsupportedoperationexception的異常。
在透明模式下,遍歷樹形結構比較容易,不用進行強制型別轉換。

public class client else 
}
}
}
當然,透明模式也具有一定的好處,它遵循了依賴倒轉原則,方便系統進行擴充套件。
可以增加乙個父結點,從而可實現樹結構的前序遍歷、中序遍歷和後序遍歷。
Linux 庫檔案(針對於Linux)
1 本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。提前寫好的某些功能的實現 函式 的集合。庫是提供給使用者使用的,不能單獨執行。實現庫檔案時都必須沒有main函式。2 庫的種類 linux下的庫有兩種 windows的靜態庫的擴充套件名為.lib 動態庫為 dll linu...
python獲取檔案真實鏈結,針對於302返回碼
使用模組requests 方式 如下 print r.headers location 擴充套件 設定屬性 allow redirects true 則head方式會自動解析重定向鏈結,requests.get 方法的allow redirects預設為true,head方法預設為false 使用r...
針對於iMatrix平台的流程引擎見解
最近在網上看到開源的imatrix開發平台,看到有瀏覽器版本的流程設計器功能,自己研究了一下它和流程引擎的結合使用原理 首先看一下imatrix平台的xml和jbpm原生的xml有什麼區別?流程屬性 環節屬性和流向屬性生成xml的原理基本一致,生成的extend元素為平台自己新增的元素,通過這些擴充...