首页 > 代码库 > 组合模式
组合模式
组合模式:组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
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 }
组合模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。