【設計模式學習筆記】迭代器模式
阿新 • • 發佈:2018-12-31
迭代器模式,這是一個很好玩的模式。其實迭代器已經存於集合中了。但是呢,我們可以動手寫一個迭代器,並且將其運用在迭代器模式中,而不是在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