设计模式:迭代器模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式:迭代器模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
迭代器模式:提供一種方法順序訪問一個聚合對象中的各個元素,而不是暴露其內部的表示。把游走的任務放在迭代器上,而不是聚合上,這樣就簡化了聚合的接口,也讓責任各得其所。
場景:有一家早餐店和一家晚餐店合并成一家餐廳,現對兩個餐廳的菜單進行合并,兩家菜單都一樣,有name,decription,price,vegetarian屬性,而早餐店的菜單是存放在List集合中,晚餐店的菜單存放在數組中,并且對晚餐的菜單數量進行了限制,不想品種太多。這時候如果服務員需要打印菜單,就可以寫for循環遍歷List,并轉換成菜單類輸出,同樣,用for循環遍歷數組,那如果有十幾家餐廳合并呢,那不是要寫十個for循環了嗎?這時候,我們就來看看迭代器模式怎么解決這問題的。
首先,我們創建一個菜單項類,表示具體的食物
//菜單項類 public class MenuItem {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;}// get方法 }接著我們創建一個迭代器接口,并且讓實現早餐迭代器和晚餐迭代器
//迭代器接口 public interface Iterator {//判斷是否還有元素boolean hasNext();//返回下一個元素 Object next(); }//早餐類迭代器 public class PancakeHouseMenuIterator implements Iterator{ArrayList items;int position = 0;public PancakeHouseMenuIterator(ArrayList items){this.items = items;}@Overridepublic Object next(){MenuItem menuItem = (MenuItem)items.get(position);position ++;return menuItem;}@Overridepublic boolean hasNext() {if(position >= items.size() || items.get(position) == null){return false;}else{return true;}} }//晚餐菜單的迭代器 public class DinerMenuIterator implements Iterator{MenuItem[] items;//記錄當前數組變量的位置int position = 0;public DinerMenuIterator(MenuItem[] items){this.items = items;}@Overridepublic Object next(){MenuItem menuItem = items[position];position ++;return menuItem;}@Overridepublic boolean hasNext() {if(position >= items.length || items[position] == null){return false;}else{return true;}} }然后我們創建菜單接口,讓早餐店和晚餐點的菜單實現這個接口
//由于早餐店菜單的方法和晚餐店菜單的方法很類似,所以我們可以定義一個接口來減少Waitress與具體類的依賴,比較我們要針對接口編程,而不針對實現編程 //菜單接口 public interface Menu {public void addItem(String name,String description,boolean vegetarian,double price);public Iterator createIterator(); }public class DinerMenu implements Menu{//限制晚餐菜單品種個數static final int MAX_ITEMS = 6;//記錄菜單項的長度int numberOfItems = 0;MenuItem[] menuItems;public DinerMenu(){menuItems = new MenuItem[MAX_ITEMS];addItem("火焰牛排","用火焰點綴的牛排",false,98.0);addItem("紅燒牛肉面","香辣可口的牛肉面",false,23.5);addItem("土豆絲蓋澆飯","酸酸辣辣的土豆絲",true,10.0);addItem("蔬菜沙拉","新鮮蔬菜拌上沙拉醬",true,9.0);}@Overridepublic void addItem(String name,String description,boolean vegetarian,double price){MenuItem menuItem = new MenuItem(name, description, vegetarian, price);if(numberOfItems >= MAX_ITEMS){System.err.println("菜單滿了,不能添加了!");}else{menuItems[numberOfItems] = menuItem;numberOfItems = numberOfItems + 1;}}//加入一個方法創建一個DinerMenuIterator并返回給客戶 @Overridepublic Iterator createIterator(){return new DinerMenuIterator(menuItems);} }//早餐類 public class PancakeHouseMenu implements Menu {ArrayList menuItems;public PancakeHouseMenu(){//初始化早餐菜單menuItems = new ArrayList();addItem("里脊雞蛋餅","雞蛋和面粉融合并煎烤而成",false,8.0);addItem("青菜包","新鮮青菜與面粉融合",true,1.5);addItem("豆腐包","絲滑豆腐與面粉融合",true,1.5);addItem("豆漿","現磨黃豆",true,2.5);}@Overridepublic void addItem(String name,String description,boolean vegetarian,double price){MenuItem menuItem = new MenuItem(name, description, vegetarian, price);menuItems.add(menuItem);}//加入一個方法創建一個PancakeHouseMenuIterator并返回給客戶 @Overridepublic Iterator createIterator(){return new PancakeHouseMenuIterator(menuItems);} }最后我們還要創建一個服務員類
//服務員類,用來合并菜單 public class Waitress {Menu pancakeHouseMenu;Menu dinerMenu;//我們其實可以把菜單存在一個List傳過來,這里為了方便就直接寫兩個菜單參數了public Waitress(Menu pancakeHouseMenu,Menu dinerMenu){this.pancakeHouseMenu = pancakeHouseMenu;this.dinerMenu = dinerMenu;}public void printMenu(){Iterator pancakeIterator = pancakeHouseMenu.createIterator();Iterator dinerIterator = dinerMenu.createIterator();System.out.println("早餐的菜單:");printMenu(pancakeIterator);System.out.println();System.out.println("晚餐菜單:");printMenu(dinerIterator);}//通過迭代器模式,我們只需要一個循環就可以實現那些list、數組、map等這些存儲的遍歷了public void printMenu(Iterator iterator){while(iterator.hasNext()){MenuItem menuItem = (MenuItem)iterator.next();System.out.println("名稱:" + menuItem.getName() + ",介紹:" + menuItem.getDescription() + ",是否素菜:" +menuItem.isVegetarian() + ",價格:" + menuItem.getPrice());}} }好了讓我們來編寫測試類來進行測試下
public class Test {public static void main(String[] args) {PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();DinerMenu dinerMenu = new DinerMenu();//創建服務員,把菜單傳給她Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);//打印菜單 waitress.printMenu();} }運行結果如下:
? ? ?
這就是迭代器模式了,就不需要我們寫那么多類似的for循環了。
?
下一節:組合模式
?
轉載于:https://www.cnblogs.com/Tony-Anne/p/6525513.html
總結
以上是生活随笔為你收集整理的设计模式:迭代器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs中调试中的命令行参数
- 下一篇: [转]批处理for命令使用指南