【设计模式】《Head First 设计模式》读书笔记——迭代器模式

来源:互联网 发布:mac安装office2013 编辑:程序博客网 时间:2024/06/05 15:21

迭代器模式:

提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。

问题简单描述:

晚餐店跟煎饼店合并,但是他们的菜单的实现所有集合不同。服务员需要打印菜单的时候如果直接遍历的话就需要知道详细的菜单的实现表示。

解决思路:

引进迭代器接口,迭代器向外提供统一的遍历方法。晚餐店、煎饼店分别提供相应的实现迭代器接口的迭代器,将迭代器给服务员,服务员就无需知道两个餐厅的菜单内部实现方式来遍历。

UML图:



实现代码:

菜单接口(Aggregate)

package iterator;import java.util.Iterator;/** * 菜单接口 * @author terry * */public interface Menu {/** * 所有菜单需要提供生成迭代器方法 * @return */public Iterator<MenuItem> createIterator();}

具体聚合类

package iterator;import java.util.Iterator;/** * 晚餐菜单 * @author terry * */public class DinnerMenu implements Menu {static final int MAX_ITEMS=5;int numberOfItems=0;MenuItem[] menuItems;public DinnerMenu() {menuItems=new MenuItem[MAX_ITEMS];addItem(new MenuItem("Vegetable BLT", 2.99, "some description"));addItem(new MenuItem("BLT", 2.99, "some description"));addItem(new MenuItem("Soup",3.29,"some description"));addItem(new MenuItem("HotDog",3.05,"some description"));}private void addItem(MenuItem menuItem){if(numberOfItems>=MAX_ITEMS){System.out.println("Sorry,menu is full,can't add item to menu");}else{menuItems[numberOfItems]=menuItem;numberOfItems++;}}/** * 生成迭代器 * @return */public Iterator<MenuItem> createIterator(){return new DinnerMenuIterator(menuItems);}}
package iterator;import java.util.ArrayList;import java.util.Iterator;/** * 煎饼屋菜单 * @author terry * */public class PancakeHouseMenu implements Menu{ArrayList<MenuItem> menuItems;public PancakeHouseMenu() {menuItems=new ArrayList<>();addItem(new MenuItem("K&B", 2.99, "some description"));addItem(new MenuItem("Regular",2.99,"some description"));addItem(new MenuItem("Blueberry",3.49,"some description"));addItem(new MenuItem("Waffles",3.59,"some description"));}private void addItem(MenuItem menuItem){menuItems.add(menuItem);}/** * 生成迭代器 * @return */public Iterator<MenuItem> createIterator(){return new PancakeHouseMenuIterator(menuItems);//return menuItems.iterator(); ArrayList支持iterator()方法}}

具体迭代器:

package iterator;import java.util.Iterator;public class DinnerMenuIterator implements Iterator<MenuItem> {//迭代器中菜单项MenuItem[] menuItems;//当前下标int postion=0;public DinnerMenuIterator(MenuItem[] menuItems) {this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(postion>=menuItems.length||menuItems[postion]==null){return false;}else{return true;}}@Overridepublic MenuItem next() {MenuItem menuItem=menuItems[postion];postion++;return menuItem;}@Overridepublic void remove() {System.out.println("can't remove");}}
package iterator;import java.util.ArrayList;import java.util.Iterator;public class PancakeHouseMenuIterator implements Iterator<MenuItem>{//菜单ArrayList<MenuItem> menuItems;//当前下标int postion=0;public PancakeHouseMenuIterator(ArrayList<MenuItem> menuItems) {this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(postion>=menuItems.size()){return false;}else{return true;}}@Overridepublic MenuItem next() {MenuItem menuItem=menuItems.get(postion);postion++;return menuItem;}@Overridepublic void remove() {System.out.println("can't remove");}}

服务员类(Client):

package iterator;import java.util.Iterator;public class Waiter { Menu dinnerMenu; Menu pancakeHouseMenu; public Waiter(Menu dinnerMenu, Menu pancakeHouseMenu) {super();this.dinnerMenu = dinnerMenu;this.pancakeHouseMenu = pancakeHouseMenu;}/** * 打印所有菜单 */public void  printMenu(){printDinnerMenu();printPancakeHouseMenu();}/** * 打印晚餐菜单 */public void printDinnerMenu(){Iterator<MenuItem> dinnerMenuIterator=dinnerMenu.createIterator();System.out.println("==================dinnerMenu==================");printMenu(dinnerMenuIterator);System.out.println();}/** * 打印煎饼摊菜单 */public void printPancakeHouseMenu(){Iterator<MenuItem> pancakeMenuIterator=pancakeHouseMenu.createIterator();System.out.println("==================pancakeHouseMenu==================");printMenu(pancakeMenuIterator);System.out.println();}/** * 按迭代器打印某菜单 * @param iterator */private void printMenu(Iterator<MenuItem> iterator){while(iterator.hasNext()){MenuItem menuItem=iterator.next();System.out.println(menuItem.getName()+"--"+menuItem.getPrice()+"——"+menuItem.getDescription());}}  }

运行结果:




迭代器允许访问聚合的元素,而不需要暴露它内部结构,将遍历聚合的工作封装到对应的迭代器中。java api提供了java.util.Iterator迭代器接口,java提供的集合类(Set、List)都支持iterator()方法,可以生成对应的迭代器。

^ ^欢迎批评指正





0 0
原创粉丝点击