您的位置:首页 > 编程语言 > Java开发

设计模式之迭代器模式(Iterator)

2017-03-16 17:43 344 查看
意图:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.

适用性:
1.访问一个聚合对象的内容而无需暴露它的内部表示
2.支持对聚合对象的多种遍历
3.为遍历不同的聚合结构提供一个统一的接口

效果:
1.它支持以不同的方式比遍历一个聚合
2.迭代器简化了聚合的接口
3.在同一个聚合上可以有多个遍历

代码实现:
实现了外部迭代器从前向后和从后向前的两种方式:

package com.git.books.b_design_patterns.p_iterator;
/**
* @Description: 迭代器顶级接口
* @author: songqinghu
* @date: 2017年3月16日 下午2:36:51
* Version:1.0
*/
public interface MyIterator<T> {

/**
* @描述:移动光标 返回当前元素
* @return T
* @createTime:2017年3月16日
* @author: songqinghu
*/
public T next();
/**
* @描述:光标移动到第一个
* @return void
* @createTime:2017年3月16日
* @author: songqinghu
*/
public void first();
/**
* @描述:是否还有下一个
* @return boolean
* @createTime:2017年3月16日
* @author: songqinghu
*/
public boolean isDone();

}
package com.git.books.b_design_patterns.p_iterator;

public class BackwardMyIterator implements MyIterator<SomeThing> {

private ShoppingCart shop;

private int state;

public BackwardMyIterator(ShoppingCart shop) {
this.shop = shop;
first();
}

@Override
public SomeThing next() {
if(!isDone()){
SomeThing thing = shop.currentThing(state);
state--;
return thing;
}else{
throw new RuntimeException("the thing is over!");
}

}

@Override
public void first() {
state = shop.count()-1;
}

@Override
public boolean isDone() {
return state <0;
}

}

package com.git.books.b_design_patterns.p_iterator;
/**
* @Description: 向前的迭代器
* @author: songqinghu
* @date: 2017年3月16日 下午2:47:25
* Version:1.0
*/
public class ForwardMyIterator implements MyIterator<SomeThing>{

private ShoppingCart shop;
private int state;

public ForwardMyIterator(ShoppingCart shop) {
this.shop = shop;
first();
}

@Override
public SomeThing next() {

if(!isDone()){
SomeThing thing = shop.currentThing(state);
state++;
return thing;
}else{
throw new RuntimeException("the thing is over!");
}
}

@Override
public void first() {
state=0;
}

@Override
public boolean isDone() {
return !(state <shop.count());
}

}

package com.git.books.b_design_patterns.p_iterator;

import java.util.Vector;

/**
* 购物车抽象类
*/
public abstract class ShoppingCart {

private Vector<SomeThing> things = new Vector<>();

public abstract MyIterator<SomeThing> createIterator();

public int count(){
return things.size();
}

SomeThing currentThing(int index){
return things.get(index);
}

public void addThing(SomeThing thing){
things.add(thing);
}

public void remove(SomeThing thing){
things.remove(thing);
}

}

package com.git.books.b_design_patterns.p_iterator;

public class AShoppingCart extends ShoppingCart {

@Override
public MyIterator<SomeThing> createIterator() {
return new ForwardMyIterator(this);
}

}

package com.git.books.b_design_patterns.p_iterator;

public class BShoppingCart extends ShoppingCart {

@Override
public MyIterator<SomeThing> createIterator() {
return new BackwardMyIterator(this);
}

}

package com.git.books.b_design_patterns.p_iterator;

public class SomeThing {

public SomeThing(String name) {
this.name = name;
}

private String name;

public String getName() {
return name;
}

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

@Override
public String toString() {
return "the thing name: " + name + " ";
}

}

package com.git.books.b_design_patterns.p_iterator;

public class IteratorClient {

public static void main(String[] args) {
ShoppingCart aShop = new AShoppingCart();
aShop.addThing(new SomeThing("洗衣机"));
aShop.addThing(new SomeThing("电视"));
aShop.addThing(new SomeThing("冰箱"));
aShop.addThing(new SomeThing("自行车"));

MyIterator<SomeThing> aIterator = aShop.createIterator();
while (!aIterator.isDone()) {
System.out.println(aIterator.next());
}
System.out.println("======分割线======");
ShoppingCart bShop = new BShoppingCart();
bShop.addThing(new SomeThing("洗衣机"));
bShop.addThing(new SomeThing("电视"));
bShop.addThing(new SomeThing("冰箱"));
bShop.addThing(new SomeThing("自行车"));

MyIterator<SomeThing> bIterator = bShop.createIterator();
while (!bIterator.isDone()) {
System.out.println(bIterator.next());
}

}
}

运行结果:
the thing name: 洗衣机
the thing name: 电视
the thing name: 冰箱
the thing name: 自行车
======分割线======
the thing name: 自行车
the thing name: 冰箱
the thing name: 电视
the thing name: 洗衣机


结构图:



重点:
看看Java中迭代器的实现

参考:
<<设计模式>>
<<Java与模式>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息