设计模式系列之十迭代器模式

来源:互联网 发布: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就是迭代器模式的实现。如果不使用迭代器模式,可以试想一下HasTableHashSetHashMap等类型,每一个都得按对应的方式去循环遍历,相当的不方便。

上一篇:设计模式系列之九模板方法模式
下一篇:设计模式系列之十一组合模式

0 0