摘要:感謝你看到這里,迭代器模式上部分到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),度彎腰很快我會補(bǔ)全這個(gè)內(nèi)容,生命不息,編程不止參考書籍設(shè)計(jì)模式
有許多種方法可以把對象堆起來成為一個(gè)集合
好消息,當(dāng)?shù)氐牟蛷d和煎餅屋合并了,但是兩者實(shí)現(xiàn)的方式卻不同,這就造成了分歧。讓我們一起去看看把。
一個(gè)使用ArrayList集合,另一個(gè)使用數(shù)組實(shí)現(xiàn),事情看起來確實(shí)棘手,我們創(chuàng)建一個(gè)女招待作為中間人來使用兩個(gè)菜單的客戶代碼
這里就有個(gè)問題,我們在打印早餐和午餐的時(shí)候由于使用對象不同,Arraylist和數(shù)組,這樣我們就要寫兩個(gè)for循環(huán)了,倘若后面還有新的對象加進(jìn)來做晚餐呢?或許我們能想出一個(gè)辦法,讓他們的菜單實(shí)現(xiàn)一個(gè)相同的接口,我們是否可以試著封裝多個(gè)遍歷呢?步驟圖如下
OK,看來迭代器模式幫助了我們,迭代器(iterator)依賴于迭代器接口。相關(guān)類圖如下
想要在餐廳菜單中加入迭代器,我們先定義迭代器接口
package MenuItem; /** * 迭代器接口 * * @author Joy * */ public interface Iterator { // 知道是否還有更多元素 boolean hasNext(); // 返回下一個(gè)元素 Object next(); }
然后先用DinerMenuIterator類去實(shí)現(xiàn)接口
package MenuItem; /** * 實(shí)現(xiàn)迭代器 * * @author Joy * */ public class DinerMenuIterator implements Iterator { MenuItem[] items; int position = 0;// 數(shù)組索引 // 構(gòu)造器初始化傳入一個(gè)菜單項(xiàng)的數(shù)組當(dāng)參數(shù) public DinerMenuIterator(MenuItem[] items) { this.items = items; } // 返回?cái)?shù)組下一項(xiàng),索引自+1 @Override public Object next() { MenuItem menuItem = items[position]; position += 1; return menuItem; } // 判斷數(shù)組是否滿了 @Override public boolean hasNext() { if (position >= items.length || items[position] == null) { return false; } return true; } }
我們有了菜單迭代器,利用它改寫餐廳菜單,DineMenu類中這樣寫
package MenuItem; /** * 對象村餐廳 * * @author Joy * */ public class DineMenu { // 菜單總數(shù) static final int MAX_ITEMS = 6; // 菜單量 int numberOfItems = 0; MenuItem[] menuItems; // 初始化數(shù)組,添加菜單內(nèi)容 public DineMenu() { menuItems = new MenuItem[MAX_ITEMS]; addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99); addItem("BLT", "培根、生菜&西紅柿", false, 2.99); addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29); addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29); addItem("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05); } // 創(chuàng)建一個(gè)添加菜單方法 public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if (numberOfItems >= MAX_ITEMS) { System.out.println("抱歉,菜單已滿,不能添加菜單了"); } else { // 菜單還沒滿還可以繼續(xù)添加 menuItems[numberOfItems] = menuItem; numberOfItems += 1; } } // 使用迭代器遍歷菜單 public Iterator createIterator() { return new DinerMenuIterator(menuItems); } }
完整代碼如下
迭代器接口
package MenuItem; /** * 迭代器接口 * * @author Joy * */ public interface Iterator { // 知道是否還有更多元素 boolean hasNext(); // 返回下一個(gè)元素 Object next(); }
菜單類
package MenuItem; /** * 對象村餐廳 * * @author Joy * */ public class DineMenu { // 菜單總數(shù) static final int MAX_ITEMS = 6; // 菜單量 int numberOfItems = 0; MenuItem[] menuItems; // 初始化數(shù)組,添加菜單內(nèi)容 public DineMenu() { menuItems = new MenuItem[MAX_ITEMS]; addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99); addItem("BLT", "培根、生菜&西紅柿", false, 2.99); addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29); addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29); addItem("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05); } // 創(chuàng)建一個(gè)添加菜單方法 public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if (numberOfItems >= MAX_ITEMS) { System.out.println("抱歉,菜單已滿,不能添加菜單了"); } else { // 菜單還沒滿還可以繼續(xù)添加 menuItems[numberOfItems] = menuItem; numberOfItems += 1; } } // 使用迭代器遍歷菜單 public Iterator createIterator() { return new DinerMenuIterator(menuItems); } }
餐廳的實(shí)現(xiàn)以及接口
package MenuItem; /** * 實(shí)現(xiàn)迭代器 * * @author Joy * */ public class DinerMenuIterator implements Iterator { MenuItem[] items; int position = 0;// 數(shù)組索引 // 構(gòu)造器初始化傳入一個(gè)菜單項(xiàng)的數(shù)組當(dāng)參數(shù) public DinerMenuIterator(MenuItem[] items) { this.items = items; } // 返回?cái)?shù)組下一項(xiàng),索引自+1 @Override public Object next() { MenuItem menuItem = items[position]; position += 1; return menuItem; } // 判斷數(shù)組是否滿了 @Override public boolean hasNext() { if (position >= items.length || items[position] == null) { return false; } return true; } }
package MenuItem; /** * 對象村餐廳 * * @author Joy * */ public class DineMenu { // 菜單總數(shù) static final int MAX_ITEMS = 6; // 菜單量 int numberOfItems = 0; MenuItem[] menuItems; // 初始化數(shù)組,添加菜單內(nèi)容 public DineMenu() { menuItems = new MenuItem[MAX_ITEMS]; addItem("素食BLT", "(煎)培根、生菜&西紅柿并用面包做", true, 2.99); addItem("BLT", "培根、生菜&西紅柿", false, 2.99); addItem("例湯", "一碗例湯、配土豆沙拉", false, 3.29); addItem("熱狗", "熱狗、酸菜、上蓋芝士", false, 3.29); addItem("清蒸時(shí)蔬加糙米", "清蒸的蔬菜配糙米", false, 3.05); } // 創(chuàng)建一個(gè)添加菜單方法 public void addItem(String name, String description, boolean vegetarian, double price) { MenuItem menuItem = new MenuItem(name, description, vegetarian, price); if (numberOfItems >= MAX_ITEMS) { System.out.println("抱歉,菜單已滿,不能添加菜單了"); } else { // 菜單還沒滿還可以繼續(xù)添加 menuItems[numberOfItems] = menuItem; numberOfItems += 1; } } // 使用迭代器遍歷菜單 public Iterator createIterator() { return new DinerMenuIterator(menuItems); } }
同理煎餅屋的實(shí)現(xiàn)和接口
package MenuItem; import java.util.ArrayList; public class PancakeHouseIterator implements Iterator { ArrayList items; int position = 0; public PancakeHouseIterator(ArrayList items) { this.items = items; } @Override public Object next() { Object obj = items.get(position); position += 1; return obj; } @Override public boolean hasNext() { if (position >= items.size()) { return false; } return true; } }
package MenuItem; import java.util.ArrayList; /** * 對象村煎餅屋菜單 * * @author Joy * */ public class PancakeHouseMenu { ArrayList menuItems; public PancakeHouseMenu() { menuItems = new ArrayList(); addItem("K&B薄煎餅早餐", "薄煎餅,清蛋和吐司", true, 2.99); addItem("薄煎餅早餐例餐", "薄煎餅,煎蛋和香腸", false, 2.99); addItem("藍(lán)莓薄煎餅", "新鮮藍(lán)莓和藍(lán)莓糖漿做成的薄煎餅", false, 3.49); addItem("松餅", "可以選擇藍(lán)莓或草莓", true, 3.59); } // 創(chuàng)建一個(gè)添加菜單方法 public void addItem(String name, String description, boolean vegetarian, double price) { // 菜單項(xiàng)對象,并加入到ArrayList里 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); menuItems.add(menuItem); } //使用迭代器遍歷菜單 public Iterator createIterator(){ return new PancakeHouseIterator(menuItems); } }
女招待的實(shí)現(xiàn)
package MenuItem; /** * 對象村的女招待 * * @author Joy * */ public class Waitress { //創(chuàng)建兩個(gè)餐廳對象的引用 PancakeHouseMenu pancakeHouseMenu; DineMenu dineMenu; // 初始化兩個(gè)菜單 public Waitress(PancakeHouseMenu pancakeHouseMenu, DineMenu dineMenu) { this.dineMenu = dineMenu; this.pancakeHouseMenu = pancakeHouseMenu; } public void printMenu() { // 為每一個(gè)菜單創(chuàng)建一個(gè)迭代器 Iterator pancakeitIterator = pancakeHouseMenu.createIterator(); Iterator dinerIterator = dineMenu.createIterator(); System.out.println("Menu ======= BreakFast"); // 調(diào)用下面重載的方法 printMenus(pancakeitIterator); System.out.println(" Lunch"); // 調(diào)用下面重載的方法 printMenus(dinerIterator); } // 重載一個(gè)printMenu()方法 // 使用迭代器(一次循環(huán)即可)來遍歷菜單項(xiàng)并打印出來,只調(diào)用Iterator接口 public void printMenus(Iterator iterator) { while (iterator.hasNext()) { // 取得下一項(xiàng) MenuItem menuItem = (MenuItem) iterator.next(); System.out.print(menuItem.getName() + ", "); System.out.print(menuItem.getPrice() + ", "); System.out.println(menuItem.getDescription()); } } }
測試類
package TestMain; import MenuItem.DineMenu; import MenuItem.PancakeHouseMenu; import MenuItem.Waitress; public class MenuTestDrive { public static void main(String[] args) { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); DineMenu dineMenu = new DineMenu(); /** *兩個(gè)菜單都實(shí)現(xiàn)一樣的方法,但是并沒有實(shí)現(xiàn)相同的接口, *女招待還是要依賴兩個(gè)具體實(shí)現(xiàn)的菜單類 *后面就要修改這里 * */ Waitress waitress = new Waitress(pancakeHouseMenu, dineMenu); waitress.printMenu(); } }
效果圖如下
很巧妙的將兩者迭代取出來了。但兩者實(shí)現(xiàn)的接口卻完全一樣,這里其實(shí)還可以抽象出來成一個(gè)共同接口。
感謝你看到這里,迭代器模式上部分到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),90度彎腰~~~很快我會補(bǔ)全這個(gè)內(nèi)容,生命不息,編程不止!
參考書籍《Head First設(shè)計(jì)模式》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67657.html
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進(jìn)行操作,第二類是返回一個(gè)容器接口對象,上節(jié)我們介紹了...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進(jìn)行操作,第二類是返回一個(gè)容器接口對象,上節(jié)我們介紹了...
摘要:集合中的集合是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象集合的作用在類的內(nèi)部,對數(shù)據(jù)進(jìn)行組織簡單而快速的搜索大量數(shù)目的條目有的集合接口,提供了一系列排列有序的元素,并且可以在序列中進(jìn)行快速的插入和刪除有些集合接口,提供了映射關(guān) 集合 java中的集合: 是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象 集合的作用 1. 在類的內(nèi)部,對數(shù)據(jù)進(jìn)行組織 2. 簡單而快...
閱讀 1660·2021-11-16 11:41
閱讀 2457·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09