zoukankan      html  css  js  c++  java
  • 设计模式总结篇系列:组合模式(Composite)

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

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

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

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

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

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

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

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

     1 class TreeNode {
     2 
     3     private String name;
     4     private TreeNode parent;
     5     private Vector<TreeNode> children = new Vector<TreeNode>();
     6 
     7     public TreeNode() {
     8     }
     9 
    10     public TreeNode(String name) {
    11         this.name = name;
    12     }
    13 
    14     public String getName() {
    15         return name;
    16     }
    17 
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21 
    22     public TreeNode getParent() {
    23         return parent;
    24     }
    25 
    26     public void setParent(TreeNode parent) {
    27         this.parent = parent;
    28     }
    29 
    30     public Vector<TreeNode> getChildren() {
    31         return children;
    32     }
    33 
    34     public void setChildren(Vector<TreeNode> children) {
    35         this.children = children;
    36     }
    37 
    38     // 添加孩子结点
    39     public void addChild(TreeNode child) {
    40         children.add(child);
    41     }
    42 
    43     // 删除子结点
    44     public void removeChild(TreeNode child) {
    45         children.remove(child);
    46     }
    47 
    48     // 获取子结点
    49     public Enumeration<TreeNode> getChileren() {
    50         return children.elements();
    51     }
    52 
    53 }

    2.客户端类,创建树:

     1 public class Tree {
     2 
     3     private TreeNode root;
     4 
     5     public Tree() {
     6 
     7     }
     8 
     9     public Tree(String treeName) {
    10         root = new TreeNode(treeName);
    11     }
    12 
    13     public static void main(String[] args) {
    14         Tree tree = new Tree("A");
    15         TreeNode nodeB = new TreeNode("B");
    16         TreeNode nodeC = new TreeNode("C");
    17         nodeB.addChild(nodeC);
    18         tree.root.addChild(nodeB);
    19         System.out.println("build the tree finished!");
    20     }
    21 
    22 }

     

  • 相关阅读:
    优秀程序设计的Kiss原则(keep it simple,stupid)
    前端模块化 (好文分享)
    sublime 常用快捷键(转)
    认识与入门 MarkDown (转Te_Lee)
    Sublime Text 3 常用插件以及安装方法(转)
    Flex 布局
    eclipse neon 离线安装插件
    mysql 自动备份命令
    java大并发数据保存方案
    基于webapi的移动互联架构
  • 原文地址:https://www.cnblogs.com/lwbqqyumidi/p/3758182.html
Copyright © 2011-2022 走看看