你的位置:首页 > ASP.net教程

[ASP.net教程]【设计模式】8、组合模式


 

 

 1 package com.shejimoshi.structural.Composite.type1; 2  3  4 /** 5  * 功能:将对象组合成树形结构以表示“部分-整体”的层次结构。composite使得用户对单个对象和组合对象的使用具有一致性 6  * 适用:想表示对象的部分-整体层次结构 7  *     希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象 8  * 时间:2016年2月20日下午8:57:12 9  * 作者:cutter_point10 */11 public abstract class Componment12 {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 myutil10 {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_point10 */11 public class Leaf extends Componment12 {13 14   public Leaf(String name)15   {16     super(name);17   }18 19   @Override20   public void add(Componment c)21   {22     //叶子是没有子类的,他是叶子,所以添加和移除没有意义23     System.out.println("添加错误,叶子节点");24   }25 26   @Override27   public void remove(Componment c)28   {29     //叶子是没有子类的,他是叶子,所以添加和移除没有意义30     System.out.println("删除错误,叶子节点");31   }32 33   @Override34   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:4512  * 作者:cutter_point13 */14 public class Composite extends Componment15 {16   //这个是单个节点,树枝节点,可以有子节点,我们用一个list存放我们的孩子节点17   private List<Componment> children = new ArrayList<Componment>();18   19   public Composite(String name)20   {21     super(name);22   }23 24   @Override25   public void add(Componment c)26   {27     //添加一个孩子节点28     children.add(c);29   }30 31   @Override32   public void remove(Componment c)33   {34     //删除对应的节点35     children.remove(c);36   }37 38   @Override39   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     }//for52   }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 Test10 {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     //分支可以再有分支,分支226     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     //显示大树,首先大树根,那么深度就是039     root.display(0);40   }41 }

 

结果:

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