设计模式之迭代模式

来源:互联网 发布:无线高清网络摄像机 编辑:程序博客网 时间:2024/06/05 07:22

定义

提供一种方法顺序访问一个聚合对象的各个元素而有不暴露该该对象的内部表示。

使用场景

客户收购了另一家公司,客户方的老板像查看全部工资情况,但是双方存储工资使用了不同的数据结构。

代码

定义工资对象,这里仅提供名字和薪资两个属性,为了测试重写toString方法。

package iterator;public class PayModel {    private String name;    private int salary;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getSalary() {        return salary;    }    public void setSalary(int salary) {        this.salary = salary;    }    @Override    public String toString()    {        return "name="+name+" Salary="+salary;    }   }

为客户端定义一个统一的接口MyIterator

package iterator;public interface MyIterator {    public boolean hasNext();    public void next();    public PayModel currentItem();    public void first();}

客户公司实现这个接口

package iterator;public class IteratorCli  implements MyIterator{    private ConcretAggregeteCli  cli= null;    private int index = -1;    public IteratorCli(ConcretAggregeteCli cli)    {        this.cli = cli;    }    @Override    public boolean hasNext() {        // TODO 自动生成的方法存根        if (index < cli.size())        {            return true;        }        else        {            return false;//这里初次写成true了,调试了一段时间        }    }    @Override    public void next() {        // TODO 自动生成的方法存根        if (index < cli.size())        {            index++;        }    }    @Override    public PayModel currentItem() {        // TODO 自动生成的方法存根            //System.out.println(index);            return cli.get(index);    }    @Override    public void  first() {        index = 0;    }}

客户方收购的公司的接口实现

package iterator;public class IteratorPur implements MyIterator{    private AggregatePur aggPur= null;    int index = -1;    public IteratorPur(AggregatePur aggregatePur) {        // TODO 自动生成的构造函数存根        this.aggPur = aggregatePur;//这个忘记写了,调试了好久    }    @Override    public boolean hasNext() {        // TODO 自动生成的方法存根        if (index < aggPur.size())        {            return true;        }        return false;    }    @Override    public void next() {        // TODO 自动生成的方法存根        if (index < aggPur.size())        {            index++;        }    }    @Override    public PayModel currentItem() {        // TODO 自动生成的方法存根        return aggPur.get(index);    }    @Override    public void  first() {        // TODO 自动生成的方法存根        index = 0;    }}

定义聚合接口

package iterator;public interface Aggregate {    public MyIterator createIterator();}

客户公司聚合接口的实现

package iterator;import java.util.ArrayList;import java.util.List;public class ConcretAggregeteCli  implements Aggregate{    private List<PayModel> list=new ArrayList<>();     public  List getPayList()    {        return list;    }    public void  calSalary()    {        PayModel pm1 = new PayModel();        pm1.setName("Burning");        pm1.setSalary(10000);        PayModel pm2 = new PayModel();        pm2.setName("ZSMJ");        pm2.setSalary(1000);        list.add(pm1);        list.add(pm2);    }    @Override    public MyIterator createIterator() {        return new IteratorCli(this);    }    public int  size()    {        return list.size();    }    public PayModel get(int index)    {        //System.out.println(index);        return list.get(index);    }}

被收购公司聚合接口的实现

package iterator;public class AggregatePur implements Aggregate {    private PayModel[] salaryArray;    @Override    public MyIterator createIterator() {        // TODO 自动生成的方法存根        return new IteratorPur(this);    }    public PayModel[] getSalaryArray(){        //System.out.println(salaryArray[0]);        return salaryArray;    }    public void calPay(){        PayModel pm1 = new PayModel();        pm1.setName("李四");        pm1.setSalary(12000);        PayModel pm2 = new PayModel();        pm2.setName("王五");        pm2.setSalary(13000);        salaryArray  = new PayModel[2];//这里需要定义,否则会报空指针异常        salaryArray[0] = pm1;        salaryArray[1] = pm2;    }    public int  size()    {        return salaryArray.length;    }    public PayModel get(int index)    {        return salaryArray[index];    }}

客户端实现

package iterator;import java.util.List;public class Client {    public static void main(String[] args)    {        ConcretAggregeteCli cli = new ConcretAggregeteCli();        cli.calSalary();        List list = cli.getPayList();        test(cli.createIterator());        AggregatePur pur = new AggregatePur();        pur.calPay();        PayModel[] pm = pur.getSalaryArray();        test( pur.createIterator());    }    //提供一个统一的方法顺序访问聚合对象中的元素    public static void test(MyIterator mi)    {        mi.first();        while (mi.hasNext())        {                           System.out.println(mi.currentItem());                mi.next();        }    }}

运行结果:
name=Burning Salary=10000
name=ZSMJ Salary=1000
name=李四 Salary=12000
name=王五 Salary=13000

原创粉丝点击