首页 > 代码库 > 组合模式

组合模式

组合模式:组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

 1 /** 2  * 这是 菜单节点的 父类MenuComponent  3  * 我们将菜单项MenuItem和菜单Menu  都看做是菜单节点MenuComponent 4  * 但是菜单项MenuItem 从菜单节点MenuComponent 中继承下来的某些方法对它是无意义的    如add,remove 5  * 但是菜单Menu 从菜单节点MenuComponent 中继承下来的某些方法对它是无意义的    如getPrice,isVegetable 6  * @author wly 7  * 8  */ 9 public class MenuComponent {10     /**11      * 为这个菜单节点 增加一个菜单项或者菜单             菜单可以用  菜单项不能用12      * @param menu   13      */14     public void  add(MenuComponent  menuComponent)15     {16         throw  new UnsupportedOperationException("当前组件不支持该方法!");17     }18     /**19      * 为这个菜单节点 删除一个菜单项或者菜单             菜单可以用  菜单项不能用20      * @param menu21      */22     public void  remove(MenuComponent  menuComponent)23     {24         throw  new UnsupportedOperationException("当前组件不支持该方法!");25     }26     /**27      * 返回这个菜单节点的名称        菜单和菜单项均可以使用28      * @return29      */30     public  String  getName()31     {32         throw  new UnsupportedOperationException("当前组件不支持该方法!");33     }34     /**35      * 返回这个菜单节点的描述信息        菜单和菜单项均可以使用36      * @return37      */38     public  String  getDescription()39     {40         throw  new UnsupportedOperationException("当前组件不支持该方法!");41     }42     /**43      * 返回这个菜单节点的价格        菜单不可用    菜单项可以使用44      * @return45      */46     public  Double  getPrice()47     {48         throw  new UnsupportedOperationException("当前组件不支持该方法!");49     }50     /**51      * 返回这个菜单节点的是否是素食         菜单不可用    菜单项可以使用52      * @return53      */54     public  Boolean  isVegetable()55     {56         throw  new UnsupportedOperationException("当前组件不支持该方法!");57     }58     /**59      * 打印这个菜单节点的 信息      菜单和菜单项均可以使用60      * @return61      */62     public void print()63     {64         throw  new UnsupportedOperationException("当前组件不支持该方法!");65     }66 }

 

 1 /** 2  * 这是 菜单项的类    MenuItem  它继承MenuComponent类    3  * 由于MenuComponent类  默认对所有的方法都抛出不可用的异常    所以菜单项需要将 它可以使用的方法进行重写 4  * @author wly 5  * 6  */ 7 public class MenuItem extends MenuComponent { 8     private String  name; 9     private String  description;10     private double  price;11     private Boolean isVegetable;12     13     public MenuItem(String name, String description, double price,14             Boolean isVegetable) {15         super();16         this.name = name;17         this.description = description;18         this.price = price;19         this.isVegetable = isVegetable;20     }21 22     @Override23     public  String  getName()24     {25         return this.name;26     }27     @Override28     public  String getDescription()29     {30         return  this.description;31     }32     @Override33     public  Double  getPrice()34     {35         return  this.price;36     }37     @Override38     public Boolean isVegetable()39     {40         return  this.isVegetable;41     }42     @Override43     public void print()44     {45         System.out.println("名称:"+getName());46         System.out.println("描述:"+getDescription());47         System.out.println("是否是素食:"+isVegetable());48         System.out.println("价格:"+getPrice());49         System.out.println("********************");50     }51 }

 

 1 /** 2  * 这是 菜单的类    Menu  它继承MenuComponent类    3  * 由于MenuComponent类  默认对所有的方法都抛出不可用的异常    所以菜单需要将 它可以使用的方法进行重写 4  * @author wly 5  * 6  */ 7 public class Menu extends MenuComponent { 8     //一个菜单  可以包含若干个菜单项 和 子菜单    采用一个集合来保存  9     private  List<MenuComponent>   menuList;10     private  String name;11     private  String description;12     public Menu(String name, String description) {13         super();14         this.name = name;15         this.description = description;16         this.menuList = new ArrayList<MenuComponent>();17     }18     @Override19     public void  add(MenuComponent  menuComponent)20     {21         menuList.add(menuComponent);22     } 23     @Override24     public void  remove(MenuComponent  menuComponent)25     {26         menuList.remove(menuComponent);27     }28     @Override29     public  String  getName()30     {31         return this.name;32     }33     @Override34     public  String getDescription()35     {36         return  this.description;37     }38     @Override39     public void print()40     {41         System.out.println("名称:"+getName());42         System.out.println("描述:"+getDescription());43         System.out.println("****************");44         Iterator<MenuComponent>  iterator = menuList.iterator();45         while(iterator.hasNext())46         {47             MenuComponent m = iterator.next();48             m.print();                         //在打印时,如果m是菜单项 就会调用菜单项MenuItem的print方法49                                                //若果是子菜单  就会调用Menu的 print方法,形成递归调用。50         }51     }52 }

 

 1 public class TestClass { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         MenuComponent  mainMenu = new Menu("主菜单", "主菜单:包含三个菜单项,两个子菜单"); 8         MenuComponent  menuItem1 = new MenuItem("AA", "这是菜单项AA", 1.99, true); 9         MenuComponent  menuItem2 = new MenuItem("BB", "这是菜单项BB", 2.99, false);10         MenuComponent  menuItem3 = new MenuItem("CC", "这是菜单项CC", 3.99, true);11         12         mainMenu.add(menuItem1);13         mainMenu.add(menuItem2);14         mainMenu.add(menuItem3);15         16         MenuComponent  menu1 = new Menu("子菜单1","子菜单1:包含两个菜单项");17         MenuComponent  menuItem4 = new MenuItem("DD", "这是菜单项DD", 4.99, false);18         MenuComponent  menuItem5 = new MenuItem("EE", "这是菜单项EE", 5.99, true);19         menu1.add(menuItem4);20         menu1.add(menuItem5);21         22         MenuComponent  menu2 = new Menu("子菜单2","子菜单2:包含一个菜单项");23         MenuComponent  menuItem6 = new MenuItem("FF", "这是菜单项FF", 6.99, false);24         menu2.add(menuItem6);25        26         mainMenu.add(menu1);27         mainMenu.add(menu2);28         29         mainMenu.print();30         31     }32 33 }

 

组合模式