Java设计模式泛型化之迭代器模式

24 篇文章 1 订阅
17 篇文章 0 订阅

通常情况下,如果你要处理一组相同对象的集合,你会怎么做?

把它们放进List里面,然后再用Iterator方法遍历它们。

有没有想过让你自己设计的对象具有这样的iterator()方法?不用自己去一个一个的new它们。

好吧,你需要一个这样的结构:

一个抽象对象接口(它具有初始化具体对象的方法,迭代器方法)
几个具体实现类来实现这样的接口,并具有传参构造函数
一个继承了Iterator接口的抽象接口
一个具体实现类来实现这个抽象的iterator接口
一个调用者

代码如下:

抽象的对象接口

public interface CommonObject {

    public void add(String name, String description);
    
    public void print();
    
    public CommonIterator iterator();
}

具体对象的实现类

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

public class MyCommonObject implements CommonObject {
    
    private List<CommonObject> list = new ArrayList<CommonObject>();
    
    private String name;
    
    private String description;
    
    public MyCommonObject() {}
    
    public MyCommonObject(String name, String description) {
        this.name = name;
        this.description = description;
    }

    @Override
    public void add(String name, String description) {
        this.list.add(new MyCommonObject(name, description));
    }

    @Override
    public void print() {
        System.out.println("----------------");
        System.out.println("Name: " + this.name + ";\nDescription: " + this.description);
    }

    @Override
    public CommonIterator iterator() {
        return new MyCommonObjectIterator(this.list);
    }

}

自定义的抽象迭代器接口

import java.util.Iterator;

public interface CommonIterator extends Iterator {

}

具体的迭代器实现类

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

public class MyCommonObjectIterator implements CommonIterator {
    
    private List<CommonObject> list = new ArrayList<CommonObject>();
    
    private int position = 0;
    
    public MyCommonObjectIterator(List<CommonObject> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        
        if (this.position >= list.size() || list.get(position) == null) return false;
        
        return true;
    }

    @Override
    public Object next() {
        return (CommonObject) list.get(position++);
    }

    @Override
    public void remove() {
        // do nothing...
    }

}

调用者

public class IteratorCaller {

    public static void main(String[] args) {
        CommonObject co = new MyCommonObject();
        for (int i = 0; i < 10; i++) {
            co.add("Seq No. : " + i, "This is MyCommonObject(" + i + ")");
        }
        
        CommonIterator it = co.iterator();
        while (it.hasNext()) {
            CommonObject c = (CommonObject) it.next();
            c.print();
        }
    }
}

那么,如何泛型化呢?主要是在Iterator上下手。

import java.util.Iterator;

public interface CommonIterator<E extends CommonObject> extends Iterator<E> {

}

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

@SuppressWarnings("all")
public class MyCommonObjectIterator<E extends CommonObject> implements CommonIterator<E> {
    
    private List<CommonObject> list = new ArrayList<CommonObject>();
    
    private int position = 0;
    
    public MyCommonObjectIterator(List<CommonObject> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        
        if (this.position >= list.size() || list.get(position) == null) return false;
        
        return true;
    }

    @Override
    public E next() {
        return (E) list.get(position++);
    }

    @Override
    public void remove() {
        // do nothing...
    }

}

Iterator()方法也会受到影响

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

public class MyCommonObject implements CommonObject {
    
    private List<CommonObject> list = new ArrayList<CommonObject>();
    
    private String name;
    
    private String description;
    
    public MyCommonObject() {}
    
    public MyCommonObject(String name, String description) {
        this.name = name;
        this.description = description;
    }

    @Override
    public void add(String name, String description) {
        this.list.add(new MyCommonObject(name, description));
    }

    @Override
    public void print() {
        System.out.println("----------------");
        System.out.println("Name: " + this.name + ";\nDescription: " + this.description);
    }

    @Override
    public CommonIterator<CommonObject> iterator() {
        return new MyCommonObjectIterator<CommonObject>(this.list);
    }

}

调用者

public class IteratorCaller {

    public static void main(String[] args) {
        CommonObject co = new MyCommonObject();
        for (int i = 0; i < 10; i++) {
            co.add("Seq No. : " + i, "This is MyCommonObject(" + i + ")");
        }
        
        CommonIterator<CommonObject> it = co.iterator();
        while (it.hasNext()) {
            CommonObject c = it.next();
            c.print();
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值