日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式:迭代器模式

發(fā)布時(shí)間:2025/7/14 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式:迭代器模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  迭代器模式:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而不是暴露其內(nèi)部的表示。把游走的任務(wù)放在迭代器上,而不是聚合上,這樣就簡(jiǎn)化了聚合的接口,也讓責(zé)任各得其所。

  場(chǎng)景:有一家早餐店和一家晚餐店合并成一家餐廳,現(xiàn)對(duì)兩個(gè)餐廳的菜單進(jìn)行合并,兩家菜單都一樣,有name,decription,price,vegetarian屬性,而早餐店的菜單是存放在List集合中,晚餐店的菜單存放在數(shù)組中,并且對(duì)晚餐的菜單數(shù)量進(jìn)行了限制,不想品種太多。這時(shí)候如果服務(wù)員需要打印菜單,就可以寫(xiě)for循環(huán)遍歷List,并轉(zhuǎn)換成菜單類輸出,同樣,用for循環(huán)遍歷數(shù)組,那如果有十幾家餐廳合并呢,那不是要寫(xiě)十個(gè)for循環(huán)了嗎?這時(shí)候,我們就來(lái)看看迭代器模式怎么解決這問(wèn)題的。

  首先,我們創(chuàng)建一個(gè)菜單項(xiàng)類,表示具體的食物

//菜單項(xiàng)類 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方法 }

  接著我們創(chuàng)建一個(gè)迭代器接口,并且讓實(shí)現(xiàn)早餐迭代器和晚餐迭代器

//迭代器接口 public interface Iterator {//判斷是否還有元素boolean hasNext();//返回下一個(gè)元素 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;//記錄當(dāng)前數(shù)組變量的位置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;}} }

  然后我們創(chuàng)建菜單接口,讓早餐店和晚餐點(diǎn)的菜單實(shí)現(xiàn)這個(gè)接口

//由于早餐店菜單的方法和晚餐店菜單的方法很類似,所以我們可以定義一個(gè)接口來(lái)減少Waitress與具體類的依賴,比較我們要針對(duì)接口編程,而不針對(duì)實(shí)現(xiàn)編程 //菜單接口 public interface Menu {public void addItem(String name,String description,boolean vegetarian,double price);public Iterator createIterator(); }public class DinerMenu implements Menu{//限制晚餐菜單品種個(gè)數(shù)static final int MAX_ITEMS = 6;//記錄菜單項(xiàng)的長(zhǎng)度int numberOfItems = 0;MenuItem[] menuItems;public DinerMenu(){menuItems = new MenuItem[MAX_ITEMS];addItem("火焰牛排","用火焰點(diǎn)綴的牛排",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;}}//加入一個(gè)方法創(chuàng)建一個(gè)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("豆?jié){","現(xiàn)磨黃豆",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);}//加入一個(gè)方法創(chuàng)建一個(gè)PancakeHouseMenuIterator并返回給客戶 @Overridepublic Iterator createIterator(){return new PancakeHouseMenuIterator(menuItems);} }

  最后我們還要?jiǎng)?chuàng)建一個(gè)服務(wù)員類

//服務(wù)員類,用來(lái)合并菜單 public class Waitress {Menu pancakeHouseMenu;Menu dinerMenu;//我們其實(shí)可以把菜單存在一個(gè)List傳過(guò)來(lái),這里為了方便就直接寫(xiě)兩個(gè)菜單參數(shù)了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);}//通過(guò)迭代器模式,我們只需要一個(gè)循環(huán)就可以實(shí)現(xiàn)那些list、數(shù)組、map等這些存儲(chǔ)的遍歷了public void printMenu(Iterator iterator){while(iterator.hasNext()){MenuItem menuItem = (MenuItem)iterator.next();System.out.println("名稱:" + menuItem.getName() + ",介紹:" + menuItem.getDescription() + ",是否素菜:" +menuItem.isVegetarian() + ",價(jià)格:" + menuItem.getPrice());}} }

  好了讓我們來(lái)編寫(xiě)測(cè)試類來(lái)進(jìn)行測(cè)試下

public class Test {public static void main(String[] args) {PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();DinerMenu dinerMenu = new DinerMenu();//創(chuàng)建服務(wù)員,把菜單傳給她Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);//打印菜單 waitress.printMenu();} }

  運(yùn)行結(jié)果如下:

? ? ?

  這就是迭代器模式了,就不需要我們寫(xiě)那么多類似的for循環(huán)了。

?

  下一節(jié):組合模式

?

轉(zhuǎn)載于:https://www.cnblogs.com/Tony-Anne/p/6525513.html

總結(jié)

以上是生活随笔為你收集整理的设计模式:迭代器模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。