【设计模式】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

  

原文地址:https://www.cnblogs.com/cutter-point/p/5204024.html