zoukankan      html  css  js  c++  java
  • 设计模式

    组合模式(composite pattern) 迭代器(iterator) 具体解释


    本文地址: http://blog.csdn.net/caroline_wendy


    參考组合模式(composite pattern): http://blog.csdn.net/caroline_wendy/article/details/36895627


    在组合模式(composite pattern)加入迭代器功能, 遍历每个组合(composite)的项.


    具体方法:

    1. 抽象组件类(abstract component)加入创建迭代器的方法.

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.Iterator;
    
    /**
     * @author C.L.Wang
     *
     */
    public abstract class MenuComponent {
    	public void add(MenuComponent menuComponent) {
    		throw new UnsupportedOperationException(); //假设未提供, 则不能调用
    	}
    	public void remove(MenuComponent menuComponent) {
    		throw new UnsupportedOperationException();
    	}
    	public MenuComponent getChild(int i) {
    		throw new UnsupportedOperationException();
    	}
    	public String getName() {
    		throw new UnsupportedOperationException();
    	}
    	public String getDescription() {
    		throw new UnsupportedOperationException();
    	}
    	public double getPrice() {
    		throw new UnsupportedOperationException();
    	}
    	public boolean isVegetarian() {
    		throw new UnsupportedOperationException();
    	}
    	public void print() {
    		throw new UnsupportedOperationException();
    	}
    	public Iterator<MenuComponent> createIterator() {
    		throw new UnsupportedOperationException();
    	}
    }
    

    2. 组合迭代器类(composite iterator).

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.Iterator;
    import java.util.Stack;
    
    /**
     * @author C.L.Wang
     *
     */
    public class CompositeIterator implements Iterator<MenuComponent> {
    
    	Stack<Iterator<MenuComponent>> stack = new Stack<Iterator<MenuComponent>>();
    	
    	/**
    	 * 
    	 */
    	public CompositeIterator(Iterator<MenuComponent> iterator) {
    		// TODO Auto-generated constructor stub
    		stack.push(iterator);
    	}
    	
    	public boolean hasNext() {
    		if (stack.empty()) {
    			return false;
    		} else {
    			Iterator<MenuComponent> iterator = (Iterator<MenuComponent>)stack.peek();
    			if (!iterator.hasNext()) {
    				stack.pop();
    				return hasNext(); //递归调用
    			} else {
    				return true;
    			}
    		}
    	}
    	
    	public MenuComponent next() {
    		if (hasNext()) {
    			Iterator<MenuComponent> iterator = (Iterator<MenuComponent>)stack.peek();
    			MenuComponent component = (MenuComponent)iterator.next();
    			if (component instanceof Menu) {
    				stack.push(component.createIterator());
    			}
    			return component;
    		} else {
    			return null;
    		}
    	}
    
    	public void remove() {
    		throw new UnsupportedOperationException();
    	}
    	
    }
    

    3. 组合类(composite)实现创建迭代器的方法, 并创建组合迭代器(composite iterator).

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Menu extends MenuComponent {
    
    	ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
    	String name;
    	String description;
    	
    	/**
    	 * 
    	 */
    	public Menu(String name, String description) {
    		// TODO Auto-generated constructor stub
    		this.name = name;
    		this.description = description;
    	}
    
    	public void add(MenuComponent menuComponent) {
    		menuComponents.add(menuComponent);
    	}
    	
    	public void remove(MenuComponent menuComponent) {
    		menuComponents.remove(menuComponent);
    	}
    	
    	public MenuComponent getChild(int i) {
    		return (MenuComponent)menuComponents.get(i);
    	}
    	public String getName() {
    		return name;
    	}
    	
    	public String getDescription() {
    		return description;
    	}
    	
    	public void print() {
    		System.out.print("
    " + getName());
    		System.out.println(", " + getDescription());
    		System.out.println("--------------------");
    		
    		Iterator<MenuComponent> iterator = menuComponents.iterator();
    		while (iterator.hasNext()) {
    			MenuComponent menuComponent = (MenuComponent)iterator.next();
    			menuComponent.print();
    		}
    	}
    	
    	public Iterator<MenuComponent> createIterator() {
    		return new CompositeIterator(menuComponents.iterator());
    	}
    	
    }
    

    4. 叶子类(leaf)实现创建空迭代器(null iterator)的方法.

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.Iterator;
    
    /**
     * @author C.L.Wang
     *
     */
    public class NullIterator implements Iterator<MenuComponent> {
    	public MenuComponent next() {
    		return null;
    	}
    	public boolean hasNext() {
    		return false;
    	}
    	public void remove() {
    		throw new UnsupportedOperationException();
    	}
    }
    
    
    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.Iterator;
    
    /**
     * @author C.L.Wang
     *
     */
    public class MenuItem extends MenuComponent {
    
    	String name;
    	String description;
    	boolean vegetarian;
    	double price;
    	/**
    	 * 
    	 */
    	public MenuItem(String name, String description,
    			boolean vegetarian, double price) {
    		// TODO Auto-generated constructor stub
    		this.name = name;
    		this.description = description;
    		this.vegetarian = vegetarian;
    		this.price = price;
    	}
    
    	public String getName() {
    		return name;
    	}
    	public String getDescription() {
    		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.println(", " + getPrice());
    		System.out.println("    -- " + getDescription());
    	}
    	public Iterator<MenuComponent> createIterator() {
    		return new NullIterator();
    	}
    }
    

    5. 客户类.

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    import java.util.Iterator;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Waitress {
    
    	MenuComponent allMenus;
    	/**
    	 * 
    	 */
    	public Waitress(MenuComponent allMenus) {
    		// TODO Auto-generated constructor stub
    		this.allMenus = allMenus;
    	}
    	
    	public void printMenu() {
    		allMenus.print();
    	}
    	
    	public void printVegetarianMenu() {
    		Iterator<MenuComponent> iterator = allMenus.createIterator();
    		System.out.println("
    VEGETARIAN MENU
    ----");
    		while (iterator.hasNext()) {
    			MenuComponent menuComponent = (MenuComponent)iterator.next();
    			try {
    				if (menuComponent.isVegetarian())
    					menuComponent.print();
    			} catch (UnsupportedOperationException ex) {}
    		}
    	}
    
    }
    


    6. 測试类

    /**
     * @time 2014年7月4日
     */
    package composite;
    
    /**
     * @author C.L.Wang
     *
     */
    public class MenuTestDrive {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		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 course!");
    		MenuComponent coffeeMenu = new Menu("COFFEE MENU", "Stuff to go with your afternoon coffee");
    		
    		MenuComponent allMenus = new Menu("ALL MENUS", "All menus combined");
    		
    		allMenus.add(pancakeHouseMenu);
    		allMenus.add(dinerMenu);
    		allMenus.add(cafeMenu);
    		
    		pancakeHouseMenu.add(new MenuItem(
    				"K&B's Pancake Breakfast", 
    				"Pancakes with scrambled eggs, and toast", 
    				true,
    				2.99));
    			pancakeHouseMenu.add(new MenuItem(
    				"Regular Pancake Breakfast", 
    				"Pancakes with fried eggs, sausage", 
    				false,
    				2.99));
    			pancakeHouseMenu.add(new MenuItem(
    				"Blueberry Pancakes",
    				"Pancakes made with fresh blueberries, and blueberry syrup",
    				true,
    				3.49));
    			pancakeHouseMenu.add(new MenuItem(
    				"Waffles",
    				"Waffles, with your choice of blueberries or strawberries",
    				true,
    				3.59));
    
    			dinerMenu.add(new MenuItem(
    				"Vegetarian BLT",
    				"(Fakin') Bacon with lettuce & tomato on whole wheat", 
    				true, 
    				2.99));
    			dinerMenu.add(new MenuItem(
    				"BLT",
    				"Bacon with lettuce & tomato on whole wheat", 
    				false, 
    				2.99));
    			dinerMenu.add(new MenuItem(
    				"Soup of the day",
    				"A bowl of the soup of the day, with a side of potato salad", 
    				false, 
    				3.29));
    			dinerMenu.add(new MenuItem(
    				"Hotdog",
    				"A hot dog, with saurkraut, relish, onions, topped with cheese",
    				false, 
    				3.05));
    			dinerMenu.add(new MenuItem(
    				"Steamed Veggies and Brown Rice",
    				"Steamed vegetables over brown rice", 
    				true, 
    				3.99));
    	 
    			dinerMenu.add(new MenuItem(
    				"Pasta",
    				"Spaghetti with Marinara Sauce, and a slice of sourdough bread",
    				true, 
    				3.89));
    	   
    			dinerMenu.add(dessertMenu);
    	  
    			dessertMenu.add(new MenuItem(
    				"Apple Pie",
    				"Apple pie with a flakey crust, topped with vanilla icecream",
    				true,
    				1.59));
    	  
    			dessertMenu.add(new MenuItem(
    				"Cheesecake",
    				"Creamy New York cheesecake, with a chocolate graham crust",
    				true,
    				1.99));
    			dessertMenu.add(new MenuItem(
    				"Sorbet",
    				"A scoop of raspberry and a scoop of lime",
    				true,
    				1.89));
    
    			cafeMenu.add(new MenuItem(
    				"Veggie Burger and Air Fries",
    				"Veggie burger on a whole wheat bun, lettuce, tomato, and fries",
    				true, 
    				3.99));
    			cafeMenu.add(new MenuItem(
    				"Soup of the day",
    				"A cup of the soup of the day, with a side salad",
    				false, 
    				3.69));
    			cafeMenu.add(new MenuItem(
    				"Burrito",
    				"A large burrito, with whole pinto beans, salsa, guacamole",
    				true, 
    				4.29));
    
    			cafeMenu.add(coffeeMenu);
    
    			coffeeMenu.add(new MenuItem(
    				"Coffee Cake",
    				"Crumbly cake topped with cinnamon and walnuts",
    				true,
    				1.59));
    			coffeeMenu.add(new MenuItem(
    				"Bagel",
    				"Flavors include sesame, poppyseed, cinnamon raisin, pumpkin",
    				false,
    				0.69));
    			coffeeMenu.add(new MenuItem(
    				"Biscotti",
    				"Three almond or hazelnut biscotti cookies",
    				true,
    				0.89));
    	 
    			Waitress waitress = new Waitress(allMenus);
    	   
    			waitress.printVegetarianMenu();
    	}
    
    }
    

    7. 输出.

    VEGETARIAN MENU
    ----
     K&B's Pancake Breakfast(v), 2.99
        -- Pancakes with scrambled eggs, and toast
     Blueberry Pancakes(v), 3.49
        -- Pancakes made with fresh blueberries, and blueberry syrup
     Waffles(v), 3.59
        -- Waffles, with your choice of blueberries or strawberries
     Vegetarian BLT(v), 2.99
        -- (Fakin') Bacon with lettuce & tomato on whole wheat
     Steamed Veggies and Brown Rice(v), 3.99
        -- Steamed vegetables over brown rice
     Pasta(v), 3.89
        -- Spaghetti with Marinara Sauce, and a slice of sourdough bread
     Apple Pie(v), 1.59
        -- Apple pie with a flakey crust, topped with vanilla icecream
     Cheesecake(v), 1.99
        -- Creamy New York cheesecake, with a chocolate graham crust
     Sorbet(v), 1.89
        -- A scoop of raspberry and a scoop of lime
     Apple Pie(v), 1.59
        -- Apple pie with a flakey crust, topped with vanilla icecream
     Cheesecake(v), 1.99
        -- Creamy New York cheesecake, with a chocolate graham crust
     Sorbet(v), 1.89
        -- A scoop of raspberry and a scoop of lime
     Veggie Burger and Air Fries(v), 3.99
        -- Veggie burger on a whole wheat bun, lettuce, tomato, and fries
     Burrito(v), 4.29
        -- A large burrito, with whole pinto beans, salsa, guacamole
     Coffee Cake(v), 1.59
        -- Crumbly cake topped with cinnamon and walnuts
     Biscotti(v), 0.89
        -- Three almond or hazelnut biscotti cookies
     Coffee Cake(v), 1.59
        -- Crumbly cake topped with cinnamon and walnuts
     Biscotti(v), 0.89
        -- Three almond or hazelnut biscotti cookies
    






  • 相关阅读:
    Prometheus实现微信邮件钉钉报警
    产品需求文档和原型
    各类数据集
    redis与mysql数据同步
    hadoop hbase hive spark对应版本
    Redis集群的搭建
    mysql数据库数据与redis同步
    企业级Zabbix监控实战(一)
    mysql实现高可用架构之MHA
    04-爬取单个英雄联盟英雄的符文图片
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6937787.html
Copyright © 2011-2022 走看看