zoukankan      html  css  js  c++  java
  • 【设计模式】8、组合模式

     1 package com.shejimoshi.structural.Composite.type1;
     2 
     3 
     4 /**
     5  * 功能:将对象组合成树形结构以表示“部分-整体”的层次结构。composite使得用户对单个对象和组合对象的使用具有一致性
     6  * 适用:想表示对象的部分-整体层次结构
     7  *         希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
     8  * 时间:2016年2月20日下午8:57:12
     9  * 作者:cutter_point
    10  */
    11 public abstract class Componment
    12 {
    13     protected String name;    //名字
    14     
    15     public Componment(String name)
    16     {
    17         this.name = name;
    18     }
    19     
    20     //几个基本的方法,叶子节点和枝节点都需要的,叶子节点没有子节点
    21     public abstract void add(Componment c);
    22     public abstract void remove(Componment c);
    23     public abstract void display(int depth);    //当前的深度
    24 }

    这里再display的时候,有部分代码很重复,我觉得麻烦,我就在封装了一个方法

     1 package com.shejimoshi.structural.Composite.type1;
     2 
     3 
     4 /**
     5  * 功能:工具类
     6  * 时间:2016年2月20日下午9:12:54
     7  * 作者:cutter_point
     8  */
     9 public class myutil
    10 {
    11     public static StringBuffer show(int depth)
    12     {
    13         //显示名称和深度就可以了
    14         StringBuffer sb = new StringBuffer();
    15         for(int i = 0; i < depth; ++i)
    16             sb.append("-");
    17         
    18         return sb;
    19     }
    20 }

    叶子

     1 package com.shejimoshi.structural.Composite.type1;
     2 
     3 
     4 /**
     5  * 功能:将对象组合成树形结构以表示“部分-整体”的层次结构。composite使得用户对单个对象和组合对象的使用具有一致性
     6  * 适用:想表示对象的部分-整体层次结构
     7  *         希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
     8  * 时间:2016年2月20日下午9:02:24
     9  * 作者:cutter_point
    10  */
    11 public class Leaf extends Componment
    12 {
    13 
    14     public Leaf(String name)
    15     {
    16         super(name);
    17     }
    18 
    19     @Override
    20     public void add(Componment c)
    21     {
    22         //叶子是没有子类的,他是叶子,所以添加和移除没有意义
    23         System.out.println("添加错误,叶子节点");
    24     }
    25 
    26     @Override
    27     public void remove(Componment c)
    28     {
    29         //叶子是没有子类的,他是叶子,所以添加和移除没有意义
    30         System.out.println("删除错误,叶子节点");
    31     }
    32 
    33     @Override
    34     public void display(int depth)
    35     {
    36         //显示名称和深度就可以了
    37         StringBuffer sb = myutil.show(depth);
    38         sb.append(this.name);
    39         System.out.println(sb.toString());
    40     }
    41 
    42 }

    分支节点

     1 package com.shejimoshi.structural.Composite.type1;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 
     7 /**
     8  * 功能:将对象组合成树形结构以表示“部分-整体”的层次结构。composite使得用户对单个对象和组合对象的使用具有一致性
     9  * 适用:想表示对象的部分-整体层次结构
    10  *         希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
    11  * 时间:2016年2月20日下午9:09:45
    12  * 作者:cutter_point
    13  */
    14 public class Composite extends Componment
    15 {
    16     //这个是单个节点,树枝节点,可以有子节点,我们用一个list存放我们的孩子节点
    17     private List<Componment> children = new ArrayList<Componment>();
    18     
    19     public Composite(String name)
    20     {
    21         super(name);
    22     }
    23 
    24     @Override
    25     public void add(Componment c)
    26     {
    27         //添加一个孩子节点
    28         children.add(c);
    29     }
    30 
    31     @Override
    32     public void remove(Componment c)
    33     {
    34         //删除对应的节点
    35         children.remove(c);
    36     }
    37 
    38     @Override
    39     public void display(int depth)
    40     {
    41         //首先显示当前节点信息
    42         StringBuffer sb = myutil.show(depth);
    43         sb.append(this.name);
    44         System.out.println(sb.toString());
    45         
    46         //显示相应的叶子的属性
    47         for(Componment c : children)
    48         {
    49             //吧深度添加一个标准
    50             c.display(depth + 2);
    51         }//for
    52     }
    53 
    54 }

    测试代码:

     1 package com.shejimoshi.structural.Composite.type1;
     2 
     3 
     4 /**
     5  * 功能:测试组合模式
     6  * 时间:2016年2月20日下午9:15:49
     7  * 作者:cutter_point
     8  */
     9 public class Test
    10 {
    11     public static void main(String[] args)
    12     {
    13         Composite root = new Composite("根");
    14         root.add(new Leaf("叶子A1"));
    15         root.add(new Leaf("叶子A2"));
    16         root.add(new Leaf("叶子A3"));
    17         
    18         //第一个分支
    19         Composite child1 = new Composite("分支A1");
    20         child1.add(new Leaf("叶子B1"));
    21         child1.add(new Leaf("叶子B2"));
    22         
    23         root.add(child1); //吧分支加进去
    24         
    25         //分支可以再有分支,分支2
    26         Composite child2 = new Composite("分支B1");
    27         child2.add(new Leaf("叶子C1"));
    28         child2.add(new Leaf("叶子C2"));
    29         
    30         child1.add(child2);
    31         
    32         //根部在张叶子
    33         root.add(new Leaf("叶子A4"));
    34         Leaf leaf = new Leaf("叶子A5");
    35         root.add(leaf);
    36         root.remove(leaf);
    37         
    38         //显示大树,首先大树根,那么深度就是0
    39         root.display(0);
    40     }
    41 }

    结果:

    根
    --叶子A1
    --叶子A2
    --叶子A3
    --分支A1
    ----叶子B1
    ----叶子B2
    ----分支B1
    ------叶子C1
    ------叶子C2
    --叶子A4
    

      

  • 相关阅读:
    hive 拉链表
    hive分组排序函数 分组取top10
    Hive metastore三种配置方式
    DB2基础学习3
    DB2基础学习2
    DB2的基础学习
    MySQL的基础学习
    虚拟机克隆,service network restart 重启失败
    两台电脑如何共享文件
    vmware下ubuntu14.04 nat方式上网
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5204024.html
Copyright © 2011-2022 走看看