[学习笔记]设计模式[9]-{组合模式}
2017-03-30 19:49
435 查看
设计模式
在上一个设计模式中,我们讲到了组合模式的例子。在那个例子中,我们利用迭代器将餐厅的菜单(类A 类B)进行了改造,使其可以通用地进行枚举操作,现在我们的餐厅又遇到了一个新的问题,在原来的菜单中,老板要求加上新的菜单,而新的菜单不是与原来的菜单是并列的关系,而是包含的关系!新增的菜单是原来菜单的子项。可能你已经想到了要用树结构来处理这个需求了,那么我们就来看一下设计模式中的树结构-组合模式。组合模式
先来介绍组合模式的定义:组合模式允许你将对象组合成树形结构来表现”整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
可能这个定义比较抽象,我们用实际的例子来介绍这个设计模式。
根据我们从数据结构上学习到的树结构,树的大致结构如下:
组合模式就是让我们利用树形的结构创建对象,使用组合结构(树形结构),我们能够把相同的操作应用到每个节点上,也就是说,在大多数情况下,我们可以忽略各个节点之间的区别。
还记得我们是如何实现树结构的嘛,在整个树结构中,只有一个节点对象,并没有根节点、子节点、叶节点的区分。
树结构也有其自己的遍历方法(先序遍历,后序遍历等等),这与我们的上一个迭代器模式似乎有近似的样子,那么我们来看一下,组合模式是如何解决老板的新需求的。
首先,我们要把之前的菜单对象进行改造,让他可以有子菜单:
class MenuComponent { private List<MenuComponent> menuComponents = new ArrayList<MenuComponent>(); private String name; public MenuComponent(List<MenuComponent> menuComponents, String name) { this.menuComponents = menuComponents; this.name = name; } public MenuComponent getChild(int i) { return menuComponents.get(i); } public void printMenu() { System.out.println(this.name); for (MenuComponent menu : menuComponents) { menu.printMenu(); } } public List<MenuComponent> getMenuComponents() { return menuComponents; } public void setMenuComponents(List<MenuComponent> menuComponents) { this.menuComponents = menuComponents; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
然后我们在需要使用菜单的时候就需要这么做:
public static void main(String[] args) { MenuComponent allMenu = new MenuComponent(new ArrayList<MenuComponent>(), "AllMenu"); MenuComponent pizza = new MenuComponent(new ArrayList<MenuComponent>(),"pizza"); MenuComponent coffee = new MenuComponent(new ArrayList<MenuComponent>(),"coffee"); MenuComponent dessert = new MenuComponent(new ArrayList<MenuComponent>(),"Dessert"); MenuComponent iceCream = new MenuComponent(new ArrayList<MenuComponent>(),"iceCream"); MenuComponent tart = new MenuComponent(new ArrayList<MenuComponent>(),"tart"); MenuComponent pie = new MenuComponent(new ArrayList<MenuComponent>(),"pie"); dessert.getMenuComponents().add(iceCream); dessert.getMenuComponents().add(tart); dessert.getMenuComponents().add(pie); allMenu.getMenuComponents().add(pizza); allMenu.getMenuComponents().add(coffee); allMenu.getMenuComponents().add(dessert); allMenu.printMenu(); }
这样就可以打印出所有的菜单项了。
本模式的类图与数据结构中的树形结构图相似,在此省略
相关文章推荐
- 设计模式学习笔记-组合模式
- java 设计模式学习笔记八 composite组合模式
- 设计模式学习笔记---组合模式composite(Java版)
- 设计模式学习笔记十七:组合模式(Composite Pattern)
- 设计模式学习笔记二十四:优雅的菜单 - 组合模式
- 步步为营 .NET 设计模式学习笔记 十五、Composite(组合模式)
- 《Head First 设计模式》学习笔记:迭代器模式与组合模式
- 设计模式学习笔记——组合模式
- 设计模式学习笔记Composite组合模式
- 设计模式学习笔记之组合模式模式
- 设计模式学习笔记:组合模式
- C#面向对象设计模式学习笔记(8) - Composite 组合模式(结构型模式)
- 设计模式学习笔记之组合模式
- android设计模式学习笔记02--组合模式
- java 设计模式 学习笔记(15) 组合模式
- 设计模式学习笔记——组合模式
- 设计模式学习笔记-组合模式(转载)
- 设计模式学习笔记(组合模式)
- 设计模式之禅学习笔记--组合模式
- 设计模式学习笔记之组合模式