1. 程式人生 > >java23種設計模式-組合器模式

java23種設計模式-組合器模式

定義

將物件組合成樹形結構以表示“部分整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。–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可以有很多子節點(孩子),同時子節點又可以有若干子節點,以此類推