最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 迭代器模式實(shí)例詳解

 更新時(shí)間:2017年05月26日 15:40:49   作者:jonathan_loda  
這篇文章主要介紹了java 迭代器模式實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

java 迭代器模式實(shí)例詳解

今天來818設(shè)計(jì)模式中的迭代器模式,也是java中Stack,List,Set等接口以及數(shù)組這個(gè)數(shù)據(jù)結(jié)構(gòu)都會(huì)使用的一種模式。

首先,為什么使用迭代器模式,目的就是通過一個(gè)通用的迭代方法,隱藏stack,list,set以及數(shù)組中不同的遍歷細(xì)節(jié)。也就是說,我不想讓那些調(diào)用我的遍歷容器的方法的人知道我到底是怎么一個(gè)一個(gè)的獲取這些元素的(stack的pop,list的get,數(shù)組的array[i]),我只想讓他知道他能 通過一個(gè)迭代器Iterator或者通過一個(gè)for each語句就能拿到我容器里面所有的元素。這樣就能夠最大化的隱藏實(shí)現(xiàn)細(xì)節(jié),封裝變化了。

先通過一個(gè)例子來一步步了解這其中的重要性吧。比方說,我要開發(fā)一個(gè)平臺(tái),這個(gè)平臺(tái)會(huì)獲取到京東的訂單和淘寶的訂單,然后把訂單中的所有購買條目全部打印出來。

既然要打印訂單中的所有條目,那么就得先知道這些條目,也就是訂單項(xiàng)有哪些屬性。

package iterator;

/**
 * 
* @ClassName: Item 
* @Description: 訂單項(xiàng)
* @author minjun
*
 */
public class Item {

 /**商品名稱*/
 private String name;
 
 /**價(jià)格*/
 private double price;
 
 /**描述*/
 private String desc;
 
 /**數(shù)量*/
 private int count;

 public Item(String name, double price, String desc, int count) {
 this.name = name;
 this.price = price;
 this.desc = desc;
 this.count = count;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public double getPrice() {
 return price;
 }

 public void setPrice(double price) {
 this.price = price;
 }

 public String getDesc() {
 return desc;
 }

 public void setDesc(String desc) {
 this.desc = desc;
 }

 public int getCount() {
 return count;
 }

 public void setCount(int count) {
 this.count = count;
 }

 @Override
 public String toString() {
 return "Item [name=" + name + ", price=" + price + ", desc=" + desc
  + ", count=" + count + "]";
 }
}

知道了這個(gè)條目,然后我想看看京東和淘寶是如何存儲(chǔ)這些條目的。于是我問了問劉強(qiáng)東和馬云,得知京東是用集合List存儲(chǔ),因?yàn)榉奖?,而淘寶是用?shù)組存儲(chǔ)。他們都不愿意修改存儲(chǔ)的容器,因?yàn)楦膭?dòng)太大。

這時(shí), 如果用傳統(tǒng)想法,ok,我拿到京東的List,然后通過for循環(huán)和list.get(i)獲取里面的每個(gè)條目并打印。然后拿到淘寶的array,通過for循環(huán)和array[i]獲取里面的條目并打印。是不是可以實(shí)現(xiàn)呢?確實(shí)可以,但是我發(fā)現(xiàn)這樣的話,每個(gè)容器我都要實(shí)現(xiàn)一遍不同的打印方法。目前是兩個(gè)倒還好,如果又來個(gè)誰誰誰,用鏈表來實(shí)現(xiàn)容器,那我是不是又要新加一個(gè)迭代鏈表的方法呢?我當(dāng)然不會(huì)愿意,因?yàn)檫@樣太麻煩了。于是乎,我有個(gè)想法,思路是這樣的:

我希望讓京東的訂單和淘寶的訂單都是可以方便的遍歷里面的元素,遍歷的方法能夠通過一個(gè)公共的方法來處理,而不是像之前那個(gè)分別做處理。根據(jù)這個(gè)思路,用TDD(測(cè)試驅(qū)動(dòng)開發(fā))來做步驟實(shí)現(xiàn)。先寫好測(cè)試代碼,首先我要有個(gè)訂單接口,里面有兩個(gè)子類訂單(淘寶訂單和京東訂單):

package iterator;

import org.junit.Test;

public class TestCase {

 @Test
 public void test() {
 Order o = 
  new TBOrder();//淘寶的訂單
//  new JDOrder();//京東的訂單
 printOrder(o);//打印訂單

 }

 /**打印訂單 */
 private void printOrder(Order o) {
 for (Item item : o) {
  System.out.println(item);
 }
 }
}

如果能像上述這樣打印,那會(huì)多么方便啊。如果換成淘寶訂單,就用淘寶的訂單迭代實(shí)現(xiàn),換成京東的訂單,就用京東的訂單實(shí)現(xiàn),我在測(cè)試代碼根本不需要關(guān)注實(shí)現(xiàn)細(xì)節(jié)?,F(xiàn)在我會(huì)想,如果能通過什么方法直接打印這個(gè)訂單Order中的所有條目,那才能完整的實(shí)現(xiàn)我上述的代碼。也就是說我需要我的訂單是可以遍歷的,那應(yīng)該怎么做呢?其實(shí)java中提供了這樣的接口,就是Iterable,如果我的訂單都實(shí)現(xiàn)了這個(gè)接口,那么我的訂單自然而然就可以通過一個(gè)for each循環(huán)來遍歷里面的內(nèi)容。

/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.lang;

import java.util.Iterator;

/** Implementing this interface allows an object to be the target of
 * the "foreach" statement.
 * @since 1.5
 */
public interface Iterable<T> {

  /**
   * Returns an iterator over a set of elements of type T.
   * 
   * @return an Iterator.
   */
  Iterator<T> iterator();
}

上面是java的Iterable接口,下面是我自己的訂單接口,繼承了Iterable接口

package iterator;

public interface Order extends Iterable<Item>{

}

注意上面的Order訂單接口繼承了Iterable接口之后,同樣也繼承過來了一個(gè)抽象方法iterator。這個(gè)抽象方法才是Iterable的根本實(shí)現(xiàn)方案。我們會(huì)在子類訂單中分別實(shí)現(xiàn)這個(gè)接口,然后提供京東和淘寶不同的迭代方案。

京東

package iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * @ClassName: JDOrder
 * @Description: 京東訂單
 * @author minjun
 * 
 */
public class JDOrder implements Order {

 /** 京東用集合裝訂單項(xiàng) */
 private List<Item> list = new ArrayList<Item>();

 public JDOrder() {
 add("iphone6", 5000.00, "一部手機(jī)", 2);
 add("mbp", 16000.00, "一臺(tái)電腦", 1);
 add("西門子洗衣機(jī)", 3000.00, "一臺(tái)洗衣機(jī)", 3);
 }

 /** 添加訂單條目 */
 public void add(String name, double price, String desc, int count) {
 list.add(new Item(name, price, desc, count));
 }

 @Override
 public Iterator<Item> iterator() {
 return new MyIterator();
 }

 private class MyIterator implements Iterator<Item> {

 private Iterator<Item> it = list.iterator();

 @Override
 public boolean hasNext() {
  return it.hasNext();
 }

 @Override
 public Item next() {
  return it.next();
 }

 @Override
 public void remove() {
  throw new UnsupportedOperationException("目前不支持刪除操作");
 }

 }
}

淘寶

package iterator;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 
* @ClassName: TBOrder 
* @Description: 淘寶訂單 
* @author minjun
*
 */
public class TBOrder implements Order{
 
 private int size=3;

 private Item[] orders=new Item[size];
 
 private int index=0;
 
 public TBOrder(){
 add("天貓1", 1111, "天貓活動(dòng)1", 1);
 add("天貓2", 1111, "天貓活動(dòng)1", 1);
 add("天貓3", 1111, "天貓活動(dòng)1", 1);
 add("天貓4", 1111, "天貓活動(dòng)1", 1);
 add("天貓5", 1111, "天貓活動(dòng)1", 1);
 add("天貓6", 1111, "天貓活動(dòng)1", 1);
 add("天貓7", 1111, "天貓活動(dòng)1", 1);
 add("天貓8", 1111, "天貓活動(dòng)1", 1);
 }
 
 /**添加訂單條目*/
 public void add(String name, double price, String desc, int count) {
 
 //如果超過數(shù)組大小,就擴(kuò)容
 if(index>=size-1){
  resize();
 }
  
 orders[index++]=new Item(name, price, desc, count);
 }
 
 /**擴(kuò)容*/
 private void resize() {
 size=size<<1;//移位運(yùn)算符--相當(dāng)于size=size*2
 Item[] newItems=new Item[size];
 //將原始數(shù)組內(nèi)容拷貝到新數(shù)組中去
 for(int i=0;i<orders.length;i++){
  newItems[i]=orders[i];
 }
 orders=newItems;
 }

 @Override
 public Iterator<Item> iterator() {
 return new MyIterator();
 }
 
 private class MyIterator implements Iterator<Item>{
 
 private int curr=0;

 @Override
 public boolean hasNext() {
  return orders[curr]!=null;
 }

 @Override
 public Item next() {
  if(hasNext()){
  return orders[curr++];
  }else{
  throw new NoSuchElementException("沒有這個(gè)元素");
  }
 }

 @Override
 public void remove() {
  throw new UnsupportedOperationException("目前不支持刪除操作");
 }
 
 }

}

這樣,我就做到了提供一個(gè)標(biāo)準(zhǔn)的可以迭代的Order訂單接口,然后以兩種不同的迭代實(shí)現(xiàn)方案(京東、淘寶),為我們的測(cè)試類提供了一個(gè)可以屏蔽掉內(nèi)部不同容器的具體實(shí)現(xiàn)區(qū)別。同時(shí),這也是迭代器模式的運(yùn)用。

總結(jié):需求--不同容器不同迭代方案,改進(jìn)--利用相同迭代方案來處理,將不同實(shí)現(xiàn)細(xì)節(jié)分別隱藏到容器自己的實(shí)現(xiàn)中。采用的方案就是實(shí)現(xiàn)Iterable接口,以及里面的Iterator方法,然后實(shí)現(xiàn)自己的迭代方式。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Springboot之@Controller注解不生效問題及解決

    Springboot之@Controller注解不生效問題及解決

    這篇文章主要介紹了Springboot之@Controller注解不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Java通用Mapper UUID簡(jiǎn)單示例

    Java通用Mapper UUID簡(jiǎn)單示例

    今天小編就為大家分享一篇關(guān)于Java通用Mapper UUID簡(jiǎn)單示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • MyBatis Plus復(fù)合主鍵問題的解決

    MyBatis Plus復(fù)合主鍵問題的解決

    在數(shù)據(jù)庫設(shè)計(jì)中,有時(shí)候需要使用復(fù)合主鍵來唯一標(biāo)識(shí)表中的一行數(shù)據(jù),本文將為您詳細(xì)介紹MyBatis Plus中復(fù)合主鍵的問題以及解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • mybatis-plus QueryWrapper 添加limit方式

    mybatis-plus QueryWrapper 添加limit方式

    這篇文章主要介紹了mybatis-plus QueryWrapper 添加limit方式,具有很好的參考價(jià)值,希望對(duì)大家有所
    2022-01-01
  • java Class.getSimpleName() 詳解及用法

    java Class.getSimpleName() 詳解及用法

    這篇文章主要介紹了java Class.getSimpleName() 詳解及用法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問題

    IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問題

    這篇文章主要介紹了IDEA2020 Plugins不能用的解決辦法,文中給大家介紹了Intellij IDEA 2020.1 的Plugins 搜索不了插件,連接超時(shí)的問題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-06-06
  • SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼

    SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java中import java.util.Scanner的用處詳解

    Java中import java.util.Scanner的用處詳解

    文章主要介紹Java中的Scanner類及其常用方法next()和nextLine()的區(qū)別,next()方法在遇到空格、Tab鍵、回車鍵等分隔符時(shí)結(jié)束輸入,而nextLine()方法則接收所有輸入,直到遇到回車鍵
    2024-11-11
  • Java線程同步、同步方法實(shí)例詳解

    Java線程同步、同步方法實(shí)例詳解

    本篇文章主要通過實(shí)例介紹了Java線程:線程的同步-同步方法,需要的朋友可以參考下
    2017-04-04
  • 詳解Java分布式事務(wù)的 6 種解決方案

    詳解Java分布式事務(wù)的 6 種解決方案

    在分布式系統(tǒng)、微服務(wù)架構(gòu)大行其道的今天,服務(wù)間互相調(diào)用出現(xiàn)失敗已經(jīng)成為常態(tài),本文側(cè)重于其他幾項(xiàng),關(guān)于 2PC、3PC 傳統(tǒng)事務(wù),網(wǎng)上資料已經(jīng)非常多了,這里不多做重復(fù),本文通過示例給大家介紹Java分布式事務(wù)的 6 種解決方案,一起看看吧
    2021-06-06

最新評(píng)論

沐川县| 清镇市| 施秉县| 铜鼓县| 闵行区| 固始县| 安阳县| 南乐县| 犍为县| 陇川县| 昭觉县| 景宁| 丰镇市| 齐河县| 尤溪县| 天长市| 北流市| 磐安县| 鄂伦春自治旗| 海安县| 青阳县| 侯马市| 阿拉尔市| 东城区| 松阳县| 巴里| 正宁县| 沧源| 靖远县| 保定市| 镇康县| 西充县| 洞头县| 区。| 玉门市| 吉安市| 三原县| 江安县| 疏勒县| 青冈县| 珠海市|