java23种设计模式-组合器模式

定义

将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。–GoF《设计模式》

UML

java23种设计模式-组合器模式_第1张图片

角色

  • 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可以有很多子节点(孩子),同时子节点又可以有若干子节点,以此类推

你可能感兴趣的:(java进阶,java,设计模式)