设计模式------迭代器

  • 迭代器模式:提供一个方法去顺序访问一个集合中的元素,而又不暴露这些元素的内部表示

在软件模式中的聚合对象一般有两个功能,一个就是进行基本的存储元素。另一个功能就是经行遍历的功能。但是其实第二个功能可以将其变化,或者说将其抽离出来作为一个专门的方法进行使用。

  • 角色

1、Iterator 抽象迭代类,一般为接口或者抽象类,在此类中一般有FIRST()方法,用来获得第一个元素,NEXT()方法:获得下一个元素。hasNext()方法用来判断是否有下一个元素,currentItem()方法:当前元素。

2、ConcreteIterator:具体迭代类,实现了父类的具体方法。并且在迭代的时候其实是一个游标在指向当前的元素的位置,通常标识的位置是一个非负整数。

3、Aggregate:抽象聚合类,用于存储具体的元素。并且声明了创建游标的方法。

4、ConcreteAggregate:具体聚合类,实现了父类的方法。并且创建了一个具体的迭代器对象。 


  • 迭代器模式的实现

抽象聚合类:  包含了创建的迭代器的工厂方法模式.

package com.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public abstract class AbstractObjectList {
    /**
     *  创建一个object 的arraylist集合
     */
    protected List<Object> list=new ArrayList<>();
    public AbstractObjectList(List<Object> list){
        this.list=list;
    }

    /**
     * 添加方法
     * @param o
     */
    public void addObj(Object o){
        list.add(o);
    }

    /**
     * 删除方法
     * @param o
     */
    public void remove(Object o){
        list.remove(o);
    }

    /**
     * 获取list
     * @return
     */
    public List<Object> getList(){
        return list;
    }

    /**
     * 获取迭代器的工厂方法
     * @return
     */
    public abstract ProducteIterator createIterator();


}

抽象迭代器类 :   正向和反向两个遍历的方式。通过游标,其实就是数组的下标类似。来进行遍历。 

package com.iterator;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public  abstract class AbstractIterator {
    /**
     * 移到下一个元素
     */
    public abstract void next();

    /**
     * 移到上一个元素
     */
    public abstract void previous();

    /**
     * 获取上一个元素返回object
     * @return
     */
    public abstract Object getPrevious();

    /**
     * 获取下一个元素放回OBJECT
     * @return
     */
    public abstract Object getNext();

    /**
     * 是否是最后一个元素boolean
     * @return
     */
    public abstract boolean isNext();

    /**
     * 是否是第一个元素
     * @return
     */
    public abstract boolean isFrist();
}

 具体聚合类:实现父类的方法,其次工厂类指定的是我这次需要用到的迭代器。可以进行扩展!

package com.iterator;

import java.util.List;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class ConcreteObjectList extends AbstractObjectList {

    public ConcreteObjectList(List<Object> list) {
        super(list);
    }

    @Override
    public ProducteIterator createIterator() {
        return new ProducteIterator(this);
    }
}

具体迭代器类:这个里面有迭代所需要的方法,是核心类。

package com.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class ProducteIterator extends AbstractIterator {
    private List<Object> objectList=new ArrayList<>();
    private int cursor1;	//游标
    private int cursor2;	//游标2

    public ProducteIterator(ConcreteObjectList obj) {
        // TODO Auto-generated constructor stub
        this.objectList=obj.getList();
        cursor1=0;
        cursor2=objectList.size()-1;
    }

    @Override
    public void next() {
        if (cursor1<objectList.size()){
            cursor1++;
        }
    }

    @Override
    public void previous() {
        if (cursor2>-1){
            cursor2--;
        }
    }

    @Override
    public Object getPrevious() {

        return objectList.get(cursor2);
    }

    @Override
    public Object getNext() {
        return objectList.get(cursor1);
    }

    @Override
    public boolean isNext() {
        return (cursor1==objectList.size());
    }

    @Override
    public boolean isFrist() {
        return (cursor2==-1);
    }
}

客户端

package com.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author zhaoxin
 * @Email [email protected]
 * @Description //TODO
 * @Date 2019/4/8
 **/
public class Client {
    public static void main(String[] args) {
        List<Object> list=new ArrayList<Object>();
        AbstractObjectList objectList=new ConcreteObjectList(list);
        objectList.addObj("倚天剑");
        objectList.addObj("屠龙刀");
        objectList.addObj("断肠草");
        objectList.addObj("葵花宝典");
        objectList.addObj("还我漂漂拳");

        AbstractIterator abstractIterator=objectList.createIterator();
        System.out.println("正向遍历-----------------------------");
        while(!abstractIterator.isNext()){
            System.out.println(abstractIterator.getNext()+"\t\t");
            abstractIterator.next();
        }
        System.out.println("反向遍历-----------------------------");
        while(!abstractIterator.isFrist()){
            System.out.println(abstractIterator.getPrevious()+"\t\t");
            abstractIterator.previous();
        }
    }
}
  • 优缺点

优点:

1.解耦,对象在JAVA中的迭代模式其实用的是COLLECTION继承了Iterator这个类。给自己提供了一个遍历器。我们通过自己进行创建遍历器,可以很方便。
2.遍历的算法可以通过自己来定义。还可以定义N多种算法进行遍历。
3.由于引入了抽象迭代器,所以我们进行扩展的时候会比较方便,不用修改源码。符合开闭原则。

缺点:

  1. 有利有弊,当你进行分离一个类能解决的功能的时候,就势必会增加系统类的数量!
  2. 设计抽象迭代器的时候比较困难,因为需要考虑以后的如何扩展
  • 使用场景
  1. 需要为一个集合,(聚合对象)提供N种不同的遍历方式的时候。
  2. 为不同的聚合类,提供统一的遍历方法的接口的时候。

猜你喜欢

转载自blog.csdn.net/qq_37668945/article/details/89095503