java23種設計模式-組合器模式
阿新 • • 發佈:2018-12-15
定義
將物件組合成樹形結構以表示“部分整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。–GoF《設計模式》
UML
角色
- Component: 組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告一個介面用於訪問和管理Component子部件。
- Leaf: 在組合中表示葉子結點物件,葉子結點沒有子結點。
- Composite: 定義有枝節點行為,用來儲存子部件,在Component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。
適用性
以下情況下適用組合模式:
- 你想表示物件的部分-整體層次結構
- 你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
示例
/**
* desc : 組合介面
* Created by tiantian on 2018/10/16
*/
public interface Component {
void display();
void add(Component component);
void remove(Component component);
}
/**
* desc : 具有支節點的具體組合類
* Created by tiantian on 2018/10/16
*/
public class Composite implements Component{
private List<Component> subComposite = new ArrayList<>();
@Override
public void display() {
System.out.println("I'm Composite, i have sub Composite");
}
@Override
public void add(Component component) {
subComposite.add(component);
}
@Override
public void remove(Component component) {
subComposite.remove(component);
}
}
/**
* desc : 無支節點的葉子組合類
* Created by tiantian on 2018/10/16
*/
public class Leaf implements Component{
@Override
public void display() {
System.out.println("I'm Leaf,i have no Composite");
}
@Override
public void add(Component component) {
// nothing to do
}
@Override
public void remove(Component component) {
// nothing to do
}
}
public class Client {
public static void main(String[] args) {
Component father = new Composite();
father.add(new Composite());
father.display();
Component leaf = new Leaf();
leaf.display();
father.add(leaf);
}
// output:
// I'm Composite, i have sub Composite
// I'm Leaf,i have no Composite
}
例子中的father可以有很多子節點(孩子),同時子節點又可以有若干子節點,以此類推