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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 设计模式之迭代器模式

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

一、了解迭代器模式

1.1 什么是迭代器模式

迭代器模式提供一種方法順序訪問一個(gè)聚合對象中的各個(gè)元素,而又不暴露其內(nèi)部的表示。

迭代器模式把游走的任務(wù)放在迭代器上,而不是聚合上。這樣簡化了聚合的接口和實(shí)現(xiàn),也可以讓責(zé)任各得其所。

1.2 迭代器模式組成結(jié)構(gòu)

  • 迭代器(Iterator):迭代器定義訪問和遍歷元素的接口。
  • 具體迭代器(ConcreteIterator):具體迭代器實(shí)現(xiàn)迭代器接口,對該聚合遍歷時(shí)跟蹤當(dāng)前位置。
  • 聚合(Aggregate):聚合定義創(chuàng)建相應(yīng)迭代器對象的接口。
  • 具體聚合(ConcreteAggregate):具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回 ConcreteIterator 的一個(gè)適當(dāng)?shù)膶?shí)例。

1.3 迭代器模式 UML 圖解

1.4 迭代器模式適用場景

  • 訪問一個(gè)聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
  • 支持對聚合對象的多種遍歷。
  • 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。

二、迭代器模式具體應(yīng)用

2.1 問題描述

包子店與沙縣小吃合并啦:有一家包子店,他們負(fù)責(zé)提供早餐,賣各式各樣的包子,并提供豆?jié){之類的飲品;也有一家沙縣小吃,它們負(fù)責(zé)提供午餐和晚餐,賣一些蓋澆飯和煲仔飯。為了獲得更多的盈利,后來這兩家店合并了。

但是卻發(fā)現(xiàn)了一個(gè)問題,原來的包子店提供的菜單是用 List 集合結(jié)合存儲的,而沙縣小吃的菜單卻是由數(shù)組存儲的。所以在提供菜單的時(shí)候就會很麻煩,需要使用兩個(gè)不同的循環(huán)來遍歷對應(yīng)的集合和數(shù)組,才能打印完整的菜單 (當(dāng)然這項(xiàng)工作是由服務(wù)員完成的)。有沒有更好的解決辦法呢?這時(shí)候迭代器模式就登場了。

現(xiàn)在我們將這個(gè)問題用到代碼中去實(shí)現(xiàn)。

2.2 迭代器模式問題設(shè)計(jì)

2.3 代碼實(shí)現(xiàn)

菜單信息封裝 MenuItem 類

package com.jas.iterator;/*** 用來封裝菜單食物信息*/ public class MenuItem {String name; //食物名字double price; //食物價(jià)格public MenuItem(String name, double price){this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;} }

聚合 Menu 接口

package com.jas.iterator;import java.util.Iterator;public interface Menu {Iterator<MenuItem> createIterator(); }

具體聚合 BZMenu 類

package com.jas.iterator;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** 包子菜單類,實(shí)現(xiàn)了 Menu 接口中的 createIterator() 方法*/ public class BZMenu implements Menu{List<MenuItem> menuItems;/*** 通過構(gòu)造函數(shù),在菜單里添加一些菜品*/public BZMenu() {menuItems = new ArrayList<>();addItem("雪菜包",1.0);addItem("灌湯包",1.0);addItem("韭菜包",1.0);addItem("豬肉包",1.0);}public void addItem(String name, double price){MenuItem menuItem = new MenuItem(name, price);menuItems.add(menuItem);}/*** 返回包子菜單信息的迭代器* * @return*/@Overridepublic Iterator<MenuItem> createIterator() {return new BZMenuIterator(menuItems);} }

具體聚合 SXMenu 類

package com.jas.iterator;import java.util.Iterator;/*** 沙縣菜單類,實(shí)現(xiàn)了 Menu 接口中的 createIterator() 方法*/ public class SXMenu implements Menu{static final int MAX_ITEMS = 4;int indexOfItems = 0;MenuItem[] menuItems;/*** 通過構(gòu)造函數(shù),在菜單里添加一些菜品*/public SXMenu(){menuItems = new MenuItem[MAX_ITEMS];addItem("青椒肉絲蓋澆飯",10.0);addItem("西紅柿雞蛋蓋澆飯",10.0);addItem("牛肉土豆煲仔飯",15.0);addItem("金針菇煲仔飯",10.0);}public void addItem(String name, double price){MenuItem menuItem = new MenuItem(name, price);if(indexOfItems >= MAX_ITEMS){System.out.println("菜單已滿!");}else {menuItems[indexOfItems] = menuItem;indexOfItems ++;}}/*** 返回沙縣菜單信息的迭代器* * @return*/@Overridepublic Iterator<MenuItem> createIterator() {return new SXMenuIterator(menuItems);} }

具體迭代器 BZMenuIterator 類

package com.jas.iterator;import java.util.Iterator; import java.util.List;/*** 包子菜單信息迭代器*/ public class BZMenuIterator implements Iterator {List<MenuItem> menuItems;int position = 0;/*** 通過構(gòu)造函數(shù),實(shí)例化存儲包子信息的菜單 List 集合* 雖然可以直接使用 Iterator 來遍歷集合,為了更好理解迭代器模式,這里自己手寫一個(gè)迭代器* * @param menuItems*/public BZMenuIterator(List<MenuItem> menuItems){this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(position >= menuItems.size() || menuItems.get(position) == null){return false;}else {return true;}}@Overridepublic Object next() {MenuItem menuItem = menuItems.get(position);position += 1;return menuItem;} }

具體迭代器 BZMenuIterator 類

package com.jas.iterator;import java.util.Iterator;/*** 沙縣菜單迭代器*/ public class SXMenuIterator implements Iterator {MenuItem[] menuItems;int position = 0;/*** 通過構(gòu)造函數(shù)實(shí)例化存儲沙縣信息的菜單數(shù)組* * @param menuItems*/public SXMenuIterator(MenuItem[] menuItems){this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(position >= menuItems.length || menuItems[position] == null){return false;}else {return true;}}@Overridepublic Object next() {MenuItem menuItem = menuItems[position];position += 1;return menuItem;} }

Waitress 類

package com.jas.iterator;import java.util.Iterator;public class Waitress {BZMenu bzMenu;SXMenu sxMenu;public Waitress(BZMenu bzMenu, SXMenu sxMenu){this.bzMenu = bzMenu;this.sxMenu = sxMenu;}public void printMenu(){Iterator<MenuItem> iterator = bzMenu.createIterator();Iterator<MenuItem> iterator1 = sxMenu.createIterator();System.out.println("包子菜單為:");printMenu(iterator);System.out.println("沙縣菜單為:");printMenu(iterator1);}private void printMenu(Iterator iterator){while (iterator.hasNext()){MenuItem menuItem = (MenuItem) iterator.next();System.out.print(menuItem.getName() + ": ");System.out.println(menuItem.getPrice());}} }

測試類

package com.jas.iterator;public class MenuTestDrive {public static void main(String[] args) {BZMenu bzMenu = new BZMenu();SXMenu sxMenu = new SXMenu();Waitress waitress = new Waitress(bzMenu,sxMenu);waitress.printMenu();} }/*** 輸出* 包子菜單為:* 雪菜包: 1.0* 灌湯包: 1.0* 韭菜包: 1.0* 豬肉包: 1.0* 沙縣菜單為:* 青椒肉絲蓋澆飯: 10.0* 西紅柿雞蛋蓋澆飯: 10.0* 牛肉土豆煲仔飯: 15.0* 金針菇煲仔飯: 10.0*/

2.4 問題總結(jié)

為了解決打印菜單的難題,我們新建了兩個(gè)具體迭代器,分別用于遍歷存儲包子菜單的集合和存儲沙縣菜單的數(shù)組,在包子菜單和沙縣菜單的類中提供外部可調(diào)用的遍歷菜單的迭代器。這樣一來,我們把遍歷菜單的任務(wù)放在了具體迭代器類中,而不是具體聚合類中。外部不用知道其內(nèi)部菜單是如何存儲的,你只需要給外部提供一個(gè)迭代器對象,就能完成遍歷菜單的任務(wù) 。

三、 迭代器模式總結(jié)

3.1 迭代器模式優(yōu)缺點(diǎn)總結(jié)

優(yōu)點(diǎn)

  • 它支持以不同的方式遍歷一個(gè)聚合對象。
  • 迭代器簡化了聚合類。
  • 在同一個(gè)聚合上可以有多個(gè)遍歷。
  • 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。

缺點(diǎn)

對于比較簡單的遍歷(像數(shù)組或者有序列表),使用迭代器方式遍歷較為繁瑣。

3.2 迭代器模式知識點(diǎn)總結(jié)

  • 迭代器允許訪問聚合的元素,而不需要暴露它的內(nèi)部結(jié)構(gòu)。
  • 迭代器將遍歷集合的任務(wù)封裝進(jìn)一個(gè)對象中。
  • 使用迭代器的時(shí)候,我們依賴聚合提供遍歷。
  • 迭代器提供了一個(gè)通用的接口 (可以自定義也可以使用 Java API 內(nèi)置的),讓我們遍歷聚合的項(xiàng),當(dāng)我們編碼使用聚合的項(xiàng)時(shí),可以考慮使用多態(tài)機(jī)制。

PS:點(diǎn)擊了解更多設(shè)計(jì)模式 http://blog.csdn.net/codejas/article/details/79236013

參考文獻(xiàn)

《Head First 設(shè)計(jì)模式》

總結(jié)

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

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

主站蜘蛛池模板: 91亚洲国产成人精品一区 | 日韩一级一区 | 午夜影院在线观看视频 | 亚洲人性生活视频 | 欧美综合国产 | 在线观看免费高清视频 | 一道本在线播放 | 黄色网久久 | 国产91边播边对白在线 | 成人激情开心 | 中文字幕第4页 | 亚洲精品色午夜无码专区日韩 | 啪视频在线观看 | 精品美女一区二区 | 欧美成在线视频 | 影音先锋丝袜美腿 | 久久久综合网 | 黄色av地址 | 欧美网站免费 | 国产成人精品一区二区三区福利 | 午夜在线一区二区三区 | 亚洲一二三四在线 | 亚洲射吧| 姑娘第5集在线观看免费 | 欧美精品在线免费观看 | 91九色丨porny丨肉丝 | 亚洲综合免费观看高清完整版 | 国产精品mm | 成人四色| 和美女啪啪| 国产无套内射普通话对白 | 欧美涩涩视频 | 成人网一区 | 精品国产乱码久久久久久蜜臀网站 | 毛片a片免费观看 | 日韩av在线直播 | www.com国产 | 久久国产精品久久精品国产 | 毛片一区二区 | 欧美日韩另类一区 | 一级中国毛片 | 97精品人妻一区二区 | 香蕉视频97 | 国产999 | 一区二区在线免费观看视频 | 国产在线极品 | 亚洲五月婷婷 | 欧美日韩在线观看一区 | 欧美黄色短视频 | 国产一级二级三级在线观看 | 四月婷婷 | 欧美午夜精品久久久久久浪潮 | 五月激情久久 | 日韩av高清在线观看 | 日本一二三区不卡 | 大奶骚| 中国一级片在线观看 | 亚洲色图偷拍视频 | 日本丰满肉感bbwbbwbbw | 精品国产999久久久免费 | 午夜av免费观看 | japanese24hdxxxx中文字幕 | 欧洲一级片| 中国a级大片 | 可以免费看av的网址 | 精品一区二区三区成人免费视频 | 亚洲情侣av| 久久久线视频 10 | 夜间福利在线观看 | 伊人精品一区二区三区 | 久久久久97 | 内裤摩擦1v1h| 人妻激情偷乱视频一区二区三区 | 日韩久久一区二区三区 | 99re这里只有 | 欧美色狠| 波多野结衣在线视频免费观看 | xxxxxx国产 | 俄罗斯videodesxo极品 | 国产美女激情 | 黄色一极视频 | 天天插天天狠天天透 | 亚洲xxxx18| 羞羞涩涩视频 | 奇米影视在线观看 | 拔萝卜91| 天天干狠狠插 | 日韩欧美精品中文字幕 | 中文字幕色 | 久久久不卡 | 真实的国产乱xxxx在线91 | 朝桐光av在线一区二区三区 | 国产又黄又爽又色 | 欧美一级黄色录像 | 两个小y头稚嫩紧窄h文 | 456av| 一级特黄色片 | 国产视频入口 | 婷婷在线免费 |