您的位置:首页 > 其它

[学习笔记]设计模式[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();
}


这样就可以打印出所有的菜单项了。

本模式的类图与数据结构中的树形结构图相似,在此省略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式