组合模式Component

简介

  组合模式是一种结构型模式,将对象组合成树形结构以表示“部分-整体”的层次结构。
组合模式使得用户对单个对象和组合对象的使用具有唯一性。解决对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。

角色

  Component : 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。
  Leaf : 表示叶节点对象。叶子节点没有子节点。
  Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。

类图

 

示例

接口

public abstract class Component {
    protected String name;

    public Component(String name) {
        this.name = name;
    }

    public abstract void add(Component component);

    public abstract void remove(Component component);

    public abstract void display();
}

叶节点

public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }

    public void add(Component component) {
        System.out.println("叶子节点不能添加");
    }

    public void remove(Component component) {
        System.out.println("叶子节点不能删除");
    }

    public void display() {
        System.out.println(name);
    }
}

枝节点

public class Composite extends Component {
    public Composite(String name) {
        super(name);
    }

    private List<Component> children = new ArrayList<Component>();

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }

    public void display() {
        System.out.println(name);
        for (Component child : children) {
            child.display();
        }
    }

}

客户端

public class Client {
    public static void main(String[] args) {
        Component root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));

        Component compX = new Composite("Composite X");
        compX.add(new Leaf("Leaf XA"));
        compX.add(new Leaf("Leaf XB"));
        root.add(compX);

        Component compXY = new Composite("Composite XY");
        compXY.add(new Leaf("Leaf XYA"));
        compXY.add(new Leaf("Leaf XYB"));
        compX.add(compXY);

        root.display();
    }
}

测试

root
Leaf A
Leaf B
Composite X
Leaf XA
Leaf XB
Composite XY
Leaf XYA
Leaf XYB
View Code

应用场景

  • 表示对象的部分-整体层次结构。
  • 客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。

分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统

Head First 设计模式(中文版)的示例:

码云地址:hxxps://gitee.com/manusas/CompositeDP

原文地址:https://www.cnblogs.com/manusas/p/8482052.html