组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承、组合和聚合。

继承是is-a的关系。组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系。

组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象。如人和手之间的关系,人都没了,还何来手?

聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等函数形式),如人有一台电脑的关系。

总体说来,组合关系相对聚合而言整体和部分关系感更强一些。

回到正题,组合模式中当然在组合对象中含有被组合对象的引用,只是不同的是,组合模式在概念上更加严格,通常是指引用的被组合对象类型就是组合对象的类型。如此一来,使得组合对象和被组合对象处理起来具有一致性。当然,前提是组合被对象和被组合对象在本身的概念层次上具有此一致性。

最为经典的体现组合模式的例子是具有树形结构特点的类定义。对于树形结构中的每个结点,由于父结点的孩子节点有可能是有自己的孩子结点,因此,利用组合模式,将所有结点统一设计成同一种类型即可。

1.定义树中结点类, 每个结点都有结点名称,父节点和孩子结点:

class TreeNode {

    private String name;
    private TreeNode parent;
    private Vector<TreeNode> children = new Vector<TreeNode>();

    public TreeNode() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TreeNode getParent() {
        return parent;
    }

    public void setParent(TreeNode parent) {
        this.parent = parent;
    }

    public Vector<TreeNode> getChildren() {
        return children;
    }

    public void setChildren(Vector<TreeNode> children) {
        this.children = children;
    }

    // 添加孩子结点
    public void addChild(TreeNode child) {
        children.add(child);
    }

    // 删除子结点
    public void removeChild(TreeNode child) {
        children.remove(child);
    }

    // 获取子结点
    public Enumeration<TreeNode> getChileren() {
        return children.elements();
    }

}

2.客户端类,创建树:

public class Tree {

    private TreeNode root;

    public Tree() {

    }

    public Tree(String treeName) {
        root = new TreeNode(treeName);
    }

    public static void main(String[] args) {
        Tree tree = new Tree("A");
        TreeNode nodeB = new TreeNode("B");
        TreeNode nodeC = new TreeNode("C");
        nodeB.addChild(nodeC);
        tree.root.addChild(nodeB);
        System.out.println("build the tree finished!");
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 商品类别树## 考虑这样一个实际的应用:管理商品类别树。 在实现跟商品有关的应用系统的时候...
    七寸知架构阅读 6,091评论 10 59
  • 【学习难度:★★★☆☆,使用频率:★★★★☆】直接出处:组合模式梳理和学习:https://github.com/...
    BruceOuyang阅读 1,027评论 0 1
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,799评论 0 14
  • 1.初识组合模式 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具...
    王侦阅读 1,085评论 0 2
  • 心情开花了,爱情向我敲门,我心飞扬。 过去再美好都已经过去,明天再梦幻都不及今天真实。 好好享受每一个当下,让美好...
    周海双阅读 179评论 1 2