1. 程式人生 > >【設計模式學習筆記】迭代器模式

【設計模式學習筆記】迭代器模式

迭代器模式,這是一個很好玩的模式。其實迭代器已經存於集合中了。但是呢,我們可以動手寫一個迭代器,並且將其運用在迭代器模式中,而不是在list中。

文章目錄

我們的車間每天都在生產車,但是生產多少車,生產的車叫什麼名字,每天是不是要進行報表統計?當然了我們有現成的Iterator介面。但是,請你忘記他。我們自己寫個這樣的介面,想想啊,我們自己的介面想幹啥就能幹啥。

1.1 定義一個迭代器介面及實現

package iterator;

/************************************************
 *@ClassName : iterator
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/10 0010 21:04】
 *@Version : 1.0.0
 *************************************************/

public interface Iterator {
    boolean hasNext(
); Object next(); }

簡便起見我們的介面就只有兩個抽象方法。這已經足夠了。實現如下:

package iterator;


import java.util.List;

/************************************************
 *@ClassName : CarIterator
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/10 0010 21:05】
 *@Version : 1.0.0
 *************************************************/
public class CarIterator implements Iterator { private List<Car> list; private int cnt = 0; @Override public boolean hasNext() { return cnt<list.size()?true:false; } @Override public Car next() { return list.get(cnt++);; } public CarIterator(List<Car> list) { if(list == null){ System.out.println("集合未例項化"); return; } this.list = list; } }

實現的方法也是見人見智。

1.2 我們統計生產的車是這樣的

package iterator;

/************************************************
 *@ClassName : Car
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/10 0010 21:08】
 *@Version : 1.0.0
 *************************************************/

public interface Car {
    void addCar(String carName, String price);
    Iterator getIterator();
}

統計車的時候,我們需要記錄車的名字和價格。每生產出來一輛車我們就呼叫addCar記錄。

package iterator;

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

/************************************************
 *@ClassName : CarImpl
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/10 0010 21:13】
 *@Version : 1.0.0
 *************************************************/

public class CarImpl implements Car{
    private List<Car> list = new ArrayList<>();
    private String carName;
    private String price;

    @Override
    public void addCar(String carName, String price) {
        list.add(new CarImpl(carName, price));
    }

    @Override
    public Iterator getIterator() {
        return new CarIterator(list) ;
    }

    private CarImpl(String carName, String price) {
        this.carName = carName;
        this.price = price;
    }

    public CarImpl() {
    }

    public String getCarName() {
        return carName;
    }

    public String getPrice() {
        return price;
    }
}

1.3 開始記錄了

package iterator;

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

/************************************************
 *@ClassName : Test
 *@Description : TODO
 *@Author : NikolaZhang
 *@Date : 【2018/12/10 0010 21:21】
 *@Version : 1.0.0
 *************************************************/

public class Test {
    public static void main(String[] args) {
        Car car = new CarImpl();
        car.addCar("寶馬", "1000000");
        car.addCar("賓士", "2000000");

        // 給老闆彙報
        Iterator iterator = car.getIterator();
        while(iterator.hasNext()){
            CarImpl car1 = (CarImpl) iterator.next();
            System.out.println(car1.getCarName()+"價格:"+car1.getPrice());
        }

    }
}

1.4 結果

在這裡插入圖片描述

參考

【菜鳥教程】:http://www.runoob.com/design-pattern/iterator-pattern.html