设计模式迭代器模式(IteratorPattern)

核心模块:迭代器角色(定义访问和遍历元素的接口),具体迭代器角色,容器角色,具体容器角色

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:外部对象访问内部聚合对象;
优点:将存储数据和遍历数据分开,符合单一职责原则;

缺点:新聚合类,就要增加新的迭代器类;增加系统复杂性;

/**
 * Created by tory on 2017/12/29.
 * 迭代器模式
 */
public class IteratorPattern {
    public static void main(String[] args) {
        //客户端要柔和业务员A和B的代码,两个聚合类;
        TVChannelMenu tvChannelMenu = new TVChannelMenu();
        TVMovieMenu tvMovieMenu = new TVMovieMenu();
        printMenu(tvChannelMenu.createIterator());
        printMenu(tvMovieMenu.createIterator());
    }

    //如果不使用迭代器模式这里要写两个循环遍历
    public static void printMenu(Iterator<DataItem> iterator) {
        while (iterator.hasNext()) {
            DataItem item = iterator.next();
            System.out.println("-->" + item.id + " " + item.name + " " + item.des);
        }
    }
}

//数据结构
class DataItem {
    int id;
    String name;
    String des;

    public DataItem(int id, String name, String des) {
        this.id = id;
        this.name = name;
        this.des = des;
    }
}

//Iterator 迭代器角色
interface Iterator<T> {
    boolean hasNext();

    T next();
}

//Concrete Iterator 具体迭代器角色
class TvChannelIterator implements Iterator<DataItem> {
    List<DataItem> list;
    int position = 0;

    public TvChannelIterator(List<DataItem> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return (position < list.size() - 1);
    }

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

//Container 容器角色
interface Container {
    void add(DataItem item);

    Iterator createIterator();
}

//ConcreteContainer具体容器角色
class TVChannelMenu implements Container {
    //业务员A提供的数据代码
    List<DataItem> tvchannels = new ArrayList<>();

    public TVChannelMenu() {
        tvchannels.add(new DataItem(0, "还珠格格", "琼瑶小说改变"));
        tvchannels.add(new DataItem(1, "新三国", "媲美冰与火之歌的史诗电视剧"));
        tvchannels.add(new DataItem(2, "抗日神剧", "呵呵"));
    }

    @Override
    public void add(DataItem item) {
        if (null == item) {
            return;
        }
        tvchannels.add(item);
    }
    @Override
    public Iterator createIterator() {
        Iterator iterator = new TvChannelIterator(tvchannels);
        return iterator;
    }
}

//Concrete Iterator 具体迭代器角色
class TVMovieIterator implements Iterator<DataItem> {
    DataItem[] datas;
    int MAX_LEN = 5;
    int position = 0;

    public TVMovieIterator(DataItem[] datas) {
        this.datas = datas;
    }

    @Override
    public boolean hasNext() {
        return position < MAX_LEN;
    }

    @Override
    public DataItem next() {
        return datas[position++];
    }
}

//ConcreteContainer具体容器角色
class TVMovieMenu implements Container{
    //业务员B提供的数据代码
    DataItem[] movies = new DataItem[5];

    public TVMovieMenu() {
        movies[0] = new DataItem(1, "肖生克的救赎", "一部人性解救的电影");
        movies[1] = new DataItem(2, "哈利波特1", "讲述了一个奇幻魔法世界");
        movies[2] = new DataItem(3, "变形金刚", "人与外星机器人并肩战斗");
        movies[3] = new DataItem(4, "哈利波特1", "讲述了一个奇幻魔法世界");
        movies[4] = new DataItem(5, "变形金刚", "人与外星机器人并肩战斗");
    }

    @Override
    public void add(DataItem item) {

    }
    @Override
    public Iterator createIterator() {
        TVMovieIterator iterator = new TVMovieIterator(movies);
        return iterator;
    }
}

内容打印
Hello World!
-->0 还珠格格 琼瑶小说改变
-->1 新三国 媲美冰与火之歌的史诗电视剧
-->1 肖生克的救赎 一部人性解救的电影
-->2 哈利波特1 讲述了一个奇幻魔法世界
-->3 变形金刚 人与外星机器人并肩战斗
-->4 哈利波特1 讲述了一个奇幻魔法世界
-->5 变形金刚 人与外星机器人并肩战斗

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值