设计模式系列之十迭代器模式
来源:互联网 发布:java空指针错误 编辑:程序博客网 时间:2024/05/18 02:32
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
有这样的一个需求。一家集团公司在北京和上海分别有一家子公司,每家公司内部有自己的部门,且自己提供了打印部门的方法。其中一个子公司以数组来保存部门列表,另外一个以ArrayList来保存。现在需要打印所有的部门。
一、原始实现
//部门对象public class Dept { private String name; public Dept(String name){ this.name= name; } public String getName(){ return this.name; }}
//北京分公司public class BJBranch { ArrayList<Dept> depts; public BJBranch(){ depts = new ArrayList<Dept>(); //添加部门 depts.add(new Dept("北京-财务部")); depts.add(new Dept("北京-研发部")); depts.add(new Dept("北京-开发部")); } public ArrayList<Dept> getDepts(){ return depts; }}
//上海分公司public class SHBranch { Dept[] depts; public SHBranch(){ depts = new Dept[3]; //添加部门 depts[0] = new Dept("上海-财务部"); depts[1] = new Dept("上海-研发部"); depts[2] = new Dept("上海-开发部"); } public Dept[] getDepts(){ return depts; }}
public class TestOld { public static void main(String[] args) { // TODO Auto-generated method stub BJBranch BJ = new BJBranch(); ArrayList<Dept> BJDepts = BJ.getDepts(); SHBranch SH = new SHBranch(); Dept[] SHDepts = SH.getDepts(); //遍历两家子公司的所有部门 /** 由于类型不同,需要两次循环 **/ for(int i=0;i<BJDepts.size();i++){ System.out.println(BJDepts.get(i).getName()); } for(int i=0;i<SHDepts.length;i++){ System.out.println(SHDepts[0].getName()); } }}
从上面的代码中可以看出,由于两家子公司的实现方式不一样,造成循环遍历时自能使用对应的方式来遍历,造成相当大的不便。
二、使用迭代器模式来解决问题
//迭代器接口public interface Iterator { boolean hasNext(); Object next();}
//北京分公司的部门迭代器public class BJBranchIterator implements Iterator{ ArrayList<Dept> depts; int position = 0; public BJBranchIterator(ArrayList<Dept> depts){ this.depts = depts; } @Override public boolean hasNext() { if(position>=depts.size() || depts.get(position)==null){ return false; }else{ return true; } } @Override public Object next() { Dept dept = depts.get(position); position = position + 1; return dept; }}
//改造后的北京分公司public class BJBranch { ArrayList<Dept> depts; public BJBranch(){ depts = new ArrayList<Dept>(); //添加部门 depts.add(new Dept("北京-财务部")); depts.add(new Dept("北京-研发部")); depts.add(new Dept("北京-开发部")); } /*public ArrayList<Dept> getDepts(){ return depts; }*/ //改造为返回Iterator对象,而不是ArrayList public Iterator createrIterator(){ return new BJBranchIterator(depts); }}
//上海分公司的部门迭代器public class SHBranchIterator implements Iterator{ Dept[] depts; int position = 0; public SHBranchIterator(Dept[] depts){ this.depts = depts; } @Override public boolean hasNext() { if(position>=depts.length|| depts[position]==null){ return false; }else{ return true; } } @Override public Object next() { Dept dept = depts[position]; position = position + 1; return dept; }}
//改造后的上海分公司public class SHBranch { Dept[] depts; public SHBranch(){ depts = new Dept[3]; //添加部门 depts[0] = new Dept("上海-财务部"); depts[1] = new Dept("上海-研发部"); depts[2] = new Dept("上海-开发部"); } /*public Dept[] getDepts(){ return depts; }*/ //改造为返回Iterator对象,而不是数组 public Iterator createrIterator(){ return new SHBranchIterator(depts); }}
//使用迭代器模式后的代码实现public class TestNew { public static void main(String[] args) { Iterator BJ = new BJBranch().createrIterator(); Iterator SH = new SHBranch().createrIterator(); printDeptName(BJ); printDeptName(SH); } private static void printDeptName(Iterator iterator){ while(iterator.hasNext()){ Dept dept = (Dept) iterator.next(); System.out.println(dept.getName()); } }}
从改造后的代码中可以看出,使用迭代器模式改造后,成功的屏蔽了北京与上海分公司遍历的差异。
在Java中使用Iterator
去遍历ArrayList
应该大部分人都知道,实际上这个Iterator
就是迭代器模式的实现。如果不使用迭代器模式,可以试想一下HasTable
、HashSet
、HashMap
等类型,每一个都得按对应的方式去循环遍历,相当的不方便。
上一篇:设计模式系列之九模板方法模式
下一篇:设计模式系列之十一组合模式
0 0
- 设计模式系列之十迭代器模式
- 【设计模式系列】之设计模式概述
- 设计模式探索系列之Bridge模式
- 设计模式探索系列之Bridge模式
- 【大话设计模式系列】之观察者模式
- 设计模式系列之单例模式
- 设计模式系列之 模式概述
- 设计模式系列之 工厂模式
- 设计模式系列之 单例模式
- 设计模式系列之 建造者模式
- 设计模式系列之 原型模式
- 设计模式系列之四:观察者模式
- 设计模式系列之六:策略模式
- 设计模式系列之七:外观模式
- 设计模式系列之八:适配器模式
- 设计模式系列之十:命令模式
- 设计模式系列之五:代理模式
- 设计模式系列总结之策略模式
- LayoutInflater详解
- Android自定义View--自己撸一个柱状图也没那么难
- 小技巧:textfield或者textview中长按出现的(全选,复制,粘贴)显示成中文
- 欧拉计划 21
- c++STL容器(map,set,vector,stack,queue)
- 设计模式系列之十迭代器模式
- 欧拉计划 22
- POJ_2632 机器人模拟题
- VI中的多行删除与复制
- Ray Tracing
- 用python做自动化测试--web 自动化测试(2)-Selenium 3.x启动IE, Firefox,Chrome代码示例
- Java中不同的包之间的调用。。
- Spark Streaming应用启动过程分析
- 指数分布