设计模式之迭代器模式(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();
}
结构图:
重点:
看看Java中迭代器的实现
参考:
<<设计模式>>
<<Java与模式>>
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.
适用性:
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与模式>>
相关文章推荐
- 设计模式——迭代器模式(Iterator)
- 解读设计模式----迭代器模式(Iterator Pattern),谁才是迭代高手
- .NET设计模式-迭代器模式(Iterator Pattern)
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- [导入]C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式.zip(8.04 MB)
- 设计模式 - Iterator 模式(迭代器模式)
- 深入浅出设计模式-010:迭代器模式(Iterator Pattern)
- Net设计模式实例之迭代器模式(Iterator Pattern)
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- 解读设计模式----迭代器模式(Iterator Pattern) 推荐
- .NET设计模式(18):迭代器模式(Iterator Pattern)
- 设计模式(一)之迭代器模式Iterator
- .NET设计模式-迭代器模式(Iterator Pattern)
- Net设计模式实例之迭代器模式(Iterator Pattern)(2) 推荐
- .NET设计模式(18):迭代器模式(Iterator Pattern)
- 设计模式--迭代器模式(Iterator)
- 设计模式21:Iterator Pattern (迭代器模式)
- 步步为营 .NET 设计模式学习笔记 十一、Iterator(迭代器模式)
- 设计模式-迭代器模式(Iterator Pattern)