组合模式例子
来源:互联网 发布:诲汝知之乎的感悟 编辑:程序博客网 时间:2024/05/22 03:21
组合模式笔记:
定义:
允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
例子:
节点 MenuComponent:
public abstract class MenuComponent {<span style="white-space:pre"></span><span style="white-space:pre"></span>/** 组合方法开始 */<span style="white-space:pre"></span>public void add(MenuComponent menuComponent){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>public void remove(MenuComponent menuComponent){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public MenuComponent getChild(int i){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>/** 组合方法结束 */<span style="white-space:pre"></span><span style="white-space:pre"></span>/** 操作方法开始 */<span style="white-space:pre"></span>public String getName(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public String getDescription(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>public double getPrice(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public boolean isVegetarian(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public void print(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>/** 操作方法结束 */<span style="white-space:pre"></span><span style="white-space:pre"></span>public Iterator<MenuComponent> createIterator(){<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}}
子节点 (Menu):public class Menu extends MenuComponent{<span style="white-space:pre"></span>Iterator<MenuComponent> iterator = null;<span style="white-space:pre"></span>ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();<span style="white-space:pre"></span>String name;<span style="white-space:pre"></span>String description;<span style="white-space:pre"></span><span style="white-space:pre"></span>public Menu(String name,String description){<span style="white-space:pre"></span>this.name = name;<span style="white-space:pre"></span>this.description = description;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public void add(MenuComponent menuComponent){<span style="white-space:pre"></span>menuComponents.add(menuComponent);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public void remove(MenuComponent menuComponent){<span style="white-space:pre"></span>menuComponents.remove(menuComponent);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public MenuComponent getChild(int i){<span style="white-space:pre"></span>return (MenuComponent)menuComponents.get(i);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public String getName(){<span style="white-space:pre"></span>return name;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public String getDescription(){<span style="white-space:pre"></span>return description;<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public void print(){<span style="white-space:pre"></span>System.out.print("\n" + getName());<span style="white-space:pre"></span>System.out.println("," + getDescription());<span style="white-space:pre"></span>System.out.println("---------------------");<span style="white-space:pre"></span><span style="white-space:pre"></span>Iterator<MenuComponent> iterator = menuComponents.iterator();//<span style="white-space:pre"></span>Iterator iterator = createIterator();<span style="white-space:pre"></span>while(iterator.hasNext()){<span style="white-space:pre"></span>MenuComponent menuComponent = (MenuComponent) iterator.next();<span style="white-space:pre"></span>menuComponent.print();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>public Iterator<MenuComponent> createIterator(){//<span style="white-space:pre"></span>print();//<span style="white-space:pre"></span>System.out.println("List size : " + menuComponents.size());//<span style="white-space:pre"></span>return menuComponents.iterator();<span style="white-space:pre"></span>if(iterator ==null){<span style="white-space:pre"></span>iterator = new CompositeIterator(menuComponents.iterator());<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return iterator;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}菜单项
public class MenuItem extends MenuComponent {String name;String description;boolean vegetarian;double price;public MenuItem(String name,String description,boolean vegetarian,double price){this.name = name;this.description = description;this.vegetarian = vegetarian;this.price = price;}public String getName(){return name;}public String getDescrpiton(){return description;}public double getPrice(){return price;}public boolean isVegetarian(){return vegetarian;}public void print(){System.out.print(" " + getName());if(isVegetarian()){System.out.print("(v)");}System.out.print(", " + getPrice());System.out.println(" -- " + getDescrpiton());}public Iterator createIterator(){return new NullIterator();}}
自定义迭代器:package factory.grouppattern;import java.util.Iterator;import java.util.Stack;public class CompositeIterator implements Iterator<MenuComponent> {<span style="white-space:pre"></span>Stack<Iterator<MenuComponent>> stack = new Stack<Iterator<MenuComponent>>();<span style="white-space:pre"></span>public CompositeIterator(Iterator<MenuComponent> iterator) {<span style="white-space:pre"></span>stack.push(iterator);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public boolean hasNext() {<span style="white-space:pre"></span>if(stack.empty()){<span style="white-space:pre"></span>return false;<span style="white-space:pre"></span>}else{<span style="white-space:pre"></span>Iterator<MenuComponent> iterator = (Iterator<MenuComponent>)stack.peek();<span style="white-space:pre"></span>if(!iterator.hasNext()){<span style="white-space:pre"></span>stack.pop();<span style="white-space:pre"></span>return hasNext();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else{<span style="white-space:pre"></span>return true;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public MenuComponent next() {<span style="white-space:pre"></span>if (hasNext()) {<span style="white-space:pre"></span>Iterator<MenuComponent> iterator = stack.peek();<span style="white-space:pre"></span>MenuComponent component = iterator.next();<span style="white-space:pre"></span>stack.push(component.createIterator());<span style="white-space:pre"></span>return component;<span style="white-space:pre"></span>} else {<span style="white-space:pre"></span>return null;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void remove() {<span style="white-space:pre"></span>throw new UnsupportedOperationException();<span style="white-space:pre"></span>}}
空迭代器:public class NullIterator implements Iterator {@Overridepublic boolean hasNext() {return false;}@Overridepublic Object next() {return null;}@Overridepublic void remove() {throw new UnsupportedOperationException();}}
客户类(waitress):public class Waitress {MenuComponent allMenus;public Waitress(MenuComponent allMenus) {this.allMenus = allMenus;}public void printMenu() {allMenus.print();}public void printVegetarianMenu() {Iterator iterator = allMenus.createIterator();System.out.println("\nVEGETARIAN MENU\n ----");while (iterator.hasNext()) {MenuComponent menuComponent = (MenuComponent) iterator.next();try {if (!menuComponent.isVegetarian()) {menuComponent.print();}} catch (UnsupportedOperationException e) {}}}}
测试类:public class MenuTestDrive {public static void main(String args[]){MenuComponent pancakeHouseMenu = new Menu("PANCAKE HOUSE MENU","BREAKFAST");MenuComponent dinerMenu = new Menu("Diner MENU","LUNCH");MenuComponent cafeMenu = new Menu("CAFE MENU","Dinner");MenuComponent dessertMenu = new Menu("DESSERT MENU","Dessert of course!");MenuComponent allMenus = new Menu("ALL MENUS","ALL menus combined");allMenus.add(pancakeHouseMenu);allMenus.add(dinerMenu);allMenus.add(cafeMenu);dinerMenu.add(new MenuItem("Pasta", "Nice bread", true, 3.89));dinerMenu.add(new MenuItem("Meat", "Nice meat", false, 3.89));dinerMenu.add(new MenuItem("Chicken", "Nice Chicken", false, 13.89));dinerMenu.add(dessertMenu);dessertMenu.add(new MenuItem("Apple Pie", "Nice apple pie", true, 1.59));dessertMenu.add(new MenuItem("Fish", "Nice fish", false, 3.89));dessertMenu.add(new MenuItem("Egg", "Nice egg", false, 1.89));Waitress waitress = new Waitress(allMenus);//waitress.printMenu();waitress.printVegetarianMenu();}}
输出:VEGETARIAN MENU ---- Fish, 3.89 -- Nice fish Egg, 1.89 -- Nice egg
总结:
-- 组合模式提供一个结构,可同时包含个别对象和组合对象。
-- 组合模式允许客户对个别对象以及组合对象一视同仁。
-- 组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
-- 在实现组合模式时,有许多设计上的折衷。你要根据需要平衡透明性和安全性。
0 0
- 组合模式例子
- 组合模式例子
- 组合模式例子
- 通过例子学设计模式之--组合模式以及使用场景说明(C++实现)
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 日语学习之沪江N3基础 20141204 -5
- Java:String和Date、Timestamp之间的转换
- 位操作基础篇之位操作全面总结
- 堆栈
- Codeforces Round #281 (Div. 2) D
- 组合模式例子
- java针对一个资源,创建多个线程来处理同一个事件
- 恢复oracle数据
- 删除linux系统
- mysql数据去重
- 第十五周 项目二:阅读程序(2.1)
- 问题 : 指针的基本操作(1)
- 如何允许root用户登录telnet服务器
- Fiddler对于HTTPS请求不能代理问题的解决