日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一文徹底搞明白迭代器模式

來源: 責編: 時間:2024-05-16 09:10:22 255觀看
導讀本篇講解Java設計模式中的迭代器模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。定義迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露

本篇講解Java設計模式中的迭代器模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。65J28資訊網——每日最新資訊28at.com

定義

迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。65J28資訊網——每日最新資訊28at.com

在新的分類方式中,迭代器模式被劃分至類之間的交互類別中,其簡化的是調用方對一個或一組對象遍歷行為的交互。65J28資訊網——每日最新資訊28at.com

65J28資訊網——每日最新資訊28at.com

模式應用前案例

在銀行業務領域中,銀行包含很多客戶,而一個客戶又可能包含多個賬戶。下面以這個案例進行說明。先來看一下未使用迭代器模式之前的代碼實現。65J28資訊網——每日最新資訊28at.com

public class Account {//賬戶類private final String accountNumber;private final double balance;public Account(String accountNumber, double balance) {this.accountNumber = accountNumber;this.balance = balance;    }// 省略其他屬性和方法public String getAccountNumber(){return this.accountNumber;    }public double getBalance(){return this.balance;    }}public class Customer {//客戶類private final String name;private final List<Account> accounts;public Customer(String name) {this.name = name;this.accounts = new ArrayList<>();    }public void addAccount(Account account) {this.accounts.add(account);    }// 遍歷賬戶信息public void displayAccounts() {        System.out.println("Customer: " + this.name);//for (Account account : this.accounts) {//底層使用Iterator實現for(int i=0;i<this.accounts.size();i++) {            System.out.println("Account Number: " + this.accounts.get(i).getAccountNumber() + ", Balance: " + this.accounts.get(i).getBalance());        }    }}public class Bank {//銀行集合類private final List<Customer> customers;public Bank(){this.customers = new ArrayList<>();    }// 添加顧客public void addCustomer(Customer customer){this.customers.add(customer);    }// 顯示所有客戶的帳號信息public void displayAllCustomersAndAccounts() {//for (Customer customer : this.customers) {//底層使用Iterator實現for(int i=0;i<this.customers.size();i++) {this.customers.get(i).displayAccounts();        }    }}public class Client {//調用方代碼public static void main(String[] args) {        Bank bank= new Bank();        Customer customer1 = new Customer ("Sun");        customer1.addAccount(new Account( "1234" ,1000.0));        customer1.addAccount(new Account( "5678",500.0));        Customer customer2 = new Customer("Wang");        customer2.addAccount(new Account( "9012" ,200.0));        customer2.addAccount(new Account( "3456",40000));        bank.addCustomer(customer1);        bank.addCustomer(customer2);        bank.displayAllCustomersAndAccounts();    }}

對于迭代器模式,Java語言中的集合已經內置支持。在上述代碼中,注釋掉的增強的for循環方式(如for (Account account : this.accounts)),其底層也會轉換成Iterator方式。65J28資訊網——每日最新資訊28at.com

因此,主要是對比for(int i=0;i<size;i++)這種方式和Iterator迭代器方式之間的優劣。65J28資訊網——每日最新資訊28at.com

結構

65J28資訊網——每日最新資訊28at.com

迭代器模式的上述結構是一個通用的結構,其代碼實現如下。65J28資訊網——每日最新資訊28at.com

public interface Iterator<T> {T next();boolean hasNext();}public class ConcreteIterator<T> implements Iterator {private int currentIndex = 0;private T[] t;public ConcreteIterator(T[] t) {this.t = t;    }@Overridepublic Object next() {return t[currentIndex++];    }@Overridepublic boolean hasNext() {return currentIndex < t.length;    }}public interface Aggregate {Iterator createIterator();}public class ConcreteAggregate implements Aggregate {public String[] items;public ConcreteAggregate() {        items = new String[10];for(int i=0;i<items.length;i++) {            items[i] = "str"+i;        }    }@Overridepublic Iterator createIterator() {return new ConcreteIterator<String>(items);    }}public class Client {public static void main(String[] args) {        ConcreteAggregate aggregate = new ConcreteAggregate();        Iterator<String> iterator =  aggregate.createIterator();while (iterator.hasNext()) {            System.out.println(iterator.next());        }    }}

模式應用后案例

由于Java語言已經內置迭代器實現。上面的銀行領域案例,如果應用迭代器模式,代碼實現如下。65J28資訊網——每日最新資訊28at.com

public class Account {//賬戶類private final String accountNumber;private final double balance;public Account(String accountNumber, double balance) {this.accountNumber = accountNumber;this.balance = balance;    }// 省略其他屬性和方法public String getAccountNumber(){return this.accountNumber;    }public double getBalance(){return this.balance;    }}public class Customer {//客戶類private final String name;private final List<Account> accounts;public Customer(String name) {this.name = name;this.accounts = new ArrayList<>();    }public void addAccount(Account account) {this.accounts.add(account);    }public Iterator<Account> iterator() {return this.accounts.iterator();    }public String getName() {return this.name;    }// 遍歷賬戶信息public void displayAccounts() {//循環賬戶        Iterator<Account> acctIterator = this.iterator();while(acctIterator.hasNext()){            Account acount = acctIterator.next();            System.out.println("Acount Number:"+acount.getAccountNumber() + ", Balance: "+acount.getBalance());        }    }}public class Bank implements Iterable<Customer>{private final List<Customer> customers;public Bank() {this.customers =new ArrayList<>();    }// 添加顧客public void addCustomer(Customer customer){this.customers.add(customer);    }@Overridepublic Iterator<Customer> iterator(){return this.customers.iterator();    }// 顯示所有客戶的帳號信息public void displayAllCustomersAndAccounts() {        Iterator<Customer> customerIterator = this.iterator();//循環客戶while(customerIterator.hasNext()) {            Customer customer = customerIterator.next();            System.out.println("Customer: " +customer.getName());            customer.displayAccounts();        }    }}public class Client {//調用方代碼public static void main(String[] args) {        Bank bank = new Bank();        Customer customer1 = new Customer("Sun");        customer1.addAccount(new Account("1234", 1000.0));        customer1.addAccount(new Account("5678", 500.0));        Customer customer2= new Customer ("Wang");        customer2.addAccount(new Account( "9012" ,200.0));        customer2.addAccount(new Account( "3456",40000));        bank.addCustomer(customer1);        bank.addCustomer(customer2);        bank.displayAllCustomersAndAccounts();    }}

Java語言中提供了Iterable接口,然后重寫里面的iterator方法。通過該方法就可以得到一個Iterator對象,然后可以利用這個Iterator對象就可以依次訪問集合中的元素。65J28資訊網——每日最新資訊28at.com

適用場景

迭代器模式適用于以下場景:65J28資訊網——每日最新資訊28at.com

1、訪問一個聚合對象的內容而無需暴露它的內部表示65J28資訊網——每日最新資訊28at.com

2、支持對聚合對象的多種遍歷方式,如樹、圖等65J28資訊網——每日最新資訊28at.com

3、對遍歷不同的聚合結構提供一個統一的接口65J28資訊網——每日最新資訊28at.com

模式可能存在的困惑

困惑1:增強for循環(如for(obj:ObjList))與Iterator迭代器方式有何區別?65J28資訊網——每日最新資訊28at.com

增強for循環方式相當于Java語言中的一種語法糖。在編譯階段,會轉換成Iterator方式實現。65J28資訊網——每日最新資訊28at.com

困惑2:普通for循環(如for(int i=0;i<size;i++))似乎也比較簡潔,Iterator相比有什么優勢?65J28資訊網——每日最新資訊28at.com

針對數組、鏈表等簡單的數據結構,兩種循環方式其實體現不出優勢。但是,對于樹和圖等復雜數據結構,普通for循環很難支持。65J28資訊網——每日最新資訊28at.com

例如,對于樹(Tree)這類數據結構,至少包括以下三種遍歷方式:65J28資訊網——每日最新資訊28at.com

1)前序遍歷(Preorder Traversal):先訪問根節點,然后遞歸地前序遍歷左子樹和右子樹;65J28資訊網——每日最新資訊28at.com

2)中序遍歷(Inorder Traversal):先遞歸地中序遍歷左子樹,然后訪問根節點,最后遞歸地中序遍歷右子樹;65J28資訊網——每日最新資訊28at.com

3)后序遍歷(Postorder Traversal):先遞歸地后序遍歷左子樹和右子樹,最后訪問根節點。65J28資訊網——每日最新資訊28at.com

對于圖(Graph)這類數據結構,至少也要支持以下兩種遍歷方式65J28資訊網——每日最新資訊28at.com

1)深度優先搜索(Depth-First Search, DFS):從起始頂點出發,在走過一條路徑上所有未被標記過的頂點之前不回退;65J28資訊網——每日最新資訊28at.com

2)廣度優先搜索(Breadth-First Search, BFS):從起始頂點開始向外層擴散搜索,并且按照距離排序依次進行探索。65J28資訊網——每日最新資訊28at.com

此外,由于迭代器是一個家族類,最上層是一個Iterable接口,后續也可以靈活擴展其他更高效的遍歷方式。65J28資訊網——每日最新資訊28at.com

本質

對于一個類來說,對于其屬性或狀態的遍歷是類的一種行為。但是,這種行為不屬于核心業務操作。65J28資訊網——每日最新資訊28at.com

因此,迭代器模式的本質上是將這種遍歷行為通用化,這樣也可以為調用方提供統一的訪問接口。65J28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88392-0.html一文徹底搞明白迭代器模式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 揭秘 Java 跨系統文件路徑組裝的秘方!

下一篇: Kafka六大使用場景以及核心概念,你知道幾個?

標簽:
  • 熱門焦點
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美自拍偷拍| 99精品99久久久久久宅男| 国产精品视频导航| 国产精品久久午夜夜伦鲁鲁| 国产精品一区在线观看| 国产一区二区精品丝袜| 在线欧美三区| 在线性视频日韩欧美| 午夜国产一区| 久久中文在线| 欧美日韩国产成人在线免费 | 欧美电影免费观看| 欧美日产一区二区三区在线观看| 国产精品成人一区二区三区吃奶| 国产视频精品免费播放| 亚洲欧洲美洲综合色网| 亚洲主播在线| 美女久久一区| 国产精品看片你懂得| 精品动漫一区| 亚洲一区二区三区涩| 久久久久久97三级| 欧美三级网页| 狠狠色噜噜狠狠色综合久| 夜夜爽99久久国产综合精品女不卡| 午夜久久美女| 欧美日本一区二区视频在线观看| 国产亚洲一区二区三区在线播放| 日韩视频欧美视频| 久久精品盗摄| 欧美色中文字幕| 一区二区在线视频播放| 亚洲一区二区免费看| 欧美成人午夜激情| 国产一区二区三区的电影| 夜色激情一区二区| 久久在线91| 国产精品嫩草99a| 亚洲精品美女在线观看播放| 欧美怡红院视频| 欧美日韩一区高清| 亚洲激情视频在线| 亚洲综合视频网| 欧美国产日韩一区| 国内成+人亚洲| 一区二区三区免费观看| 男人的天堂成人在线| 国产亚洲精品v| 亚洲综合精品一区二区| 欧美日产一区二区三区在线观看| 伊人成人在线| 久久精选视频| 国产视频一区在线观看一区免费| 亚洲视屏在线播放| 欧美日韩成人在线| 亚洲国产精品第一区二区三区| 欧美在线视频一区二区| 国产精品久久一卡二卡| 99国内精品| 欧美伦理91| 91久久久亚洲精品| 免费成人av在线看| 精品电影在线观看| 久久人人爽人人爽| 韩国三级电影久久久久久| 久久成人精品无人区| 国产精品一级久久久| 亚洲一区二区三区在线播放| 欧美日韩国产黄| 日韩视频中文| 欧美另类极品videosbest最新版本| 亚洲国产美女久久久久| 久久青青草原一区二区| 国内精品视频在线观看| 久久精品国产亚洲5555| 国产一级一区二区| 久久久精品国产免大香伊| 国产一区二区看久久| 久久国产一二区| 国内精品一区二区三区| 久久久久在线| 在线播放日韩| 女女同性精品视频| 亚洲欧洲一区二区在线播放| 欧美成人免费在线观看| 亚洲激情在线激情| 欧美日本在线观看| 亚洲天堂网站在线观看视频| 国产精品扒开腿做爽爽爽软件| 亚洲午夜视频| 国产农村妇女精品| 欧美在线观看视频| 黄色日韩精品| 欧美91福利在线观看| 亚洲精品极品| 欧美三级小说| 亚洲欧美综合精品久久成人| 国产午夜精品久久久久久久| 久久久久国产精品一区| 亚洲成人在线观看视频| 欧美激情成人在线视频| av成人动漫| 国产精品永久免费| 久久精品在这里| 亚洲国产精品一区二区第四页av| 欧美激情第一页xxx| 国产精品99久久久久久宅男| 国产精品人人爽人人做我的可爱| 久久国产免费看| 亚洲国产精品一区二区三区| 欧美日本精品| 午夜国产精品视频免费体验区| 国内精品久久国产| 欧美不卡在线视频| 一区二区三区高清在线| 国产乱肥老妇国产一区二| 久久久国际精品| 亚洲美女色禁图| 一区二区三区精品国产| 国产主播一区二区三区| 亚洲黄色视屏| 伊人久久久大香线蕉综合直播 | 91久久精品一区二区别| 亚洲精品国产精品乱码不99按摩| 亚洲激情视频在线观看| 亚洲无人区一区| 久久女同互慰一区二区三区| 国产精品观看| 亚洲欧洲中文日韩久久av乱码| 久久成人精品视频| 欧美日韩精品一本二本三本| 曰本成人黄色| 久久午夜电影网| 欧美日韩精品二区第二页| 国产在线欧美日韩| 亚洲福利国产| 午夜精品三级视频福利| 久久综合影视| 欧美久久99| 伊人久久男人天堂| 亚洲三级国产| 亚洲欧美久久久久一区二区三区| 久久精品一本| 欧美午夜精品伦理| 亚洲精品视频在线播放| 欧美精品 日韩| 性一交一乱一区二区洋洋av| 国产精品亚洲片夜色在线| 亚洲精品日韩一| 欧美精品不卡| 亚洲国产电影| 欧美在线短视频| 蜜桃av噜噜一区| 国产精品久久九九| 亚洲精选大片| 国产精品久久夜| 亚洲精品偷拍| 久久精品一区二区三区不卡| 国产精品制服诱惑| 香港成人在线视频| 狠狠色丁香久久婷婷综合_中| 羞羞色国产精品| 国产在线高清精品| 久久激情综合| 国产欧美日本在线| 亚洲精品视频在线| 影视先锋久久| 欧美美女bbbb| 久久天堂av综合合色| 亚洲欧美日本日韩| 亚洲欧洲日本国产| 狠狠色综合一区二区| 国产精品看片你懂得| 欧美国产日韩视频| 久久婷婷成人综合色| 欧美一区二区三区在| 亚洲一二三四区| 亚洲美女黄网| 在线观看日产精品| 亚洲高清免费| 国产日韩精品一区二区| 99精品视频网| 欧美涩涩网站| 亚洲区一区二| 欧美精品www| 欧美另类一区| 国产视频久久网| 欧美日本中文字幕| 欧美91福利在线观看| 久久嫩草精品久久久久| 午夜一区二区三区在线观看| 亚洲深夜福利视频| 一本色道88久久加勒比精品| 黄色国产精品| 欧美日韩国产在线播放| 欧美sm视频| 久久久久国产一区二区三区四区 | 欧美色精品天天在线观看视频 | 欧美一区二区三区免费大片| 亚洲摸下面视频| 亚洲婷婷综合色高清在线| 日韩亚洲国产欧美| 日韩天天综合| 一区二区三区免费在线观看|