組合模式 針對於「部分 整體」層次結構的設計模式

2021-10-02 17:16:17 字數 2922 閱讀 1078

組合模式又稱合成模式,是用來描述部分與整體關係的一種設計模式。它的定義是:將物件組合成樹形結構以表示「部分-整體」的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

組合模式中的幾個角色:

(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元素為平台自己新增的元素,通過這些擴充...