设计模式学习(十三) 迭代器模式

场景:

  -- 提供一种可以遍历聚合对象的方式。 又称为:游标cursor模式

  -- 聚合对象:存储数据

  -- 迭代器:遍历数据

代码:

package com.lp.iterator;
//自定义的迭代器接口
public interface MyIterator {
    void first();//将游标指向第一个元素
    void next();//将游标指向下一个元素
    boolean hasNext();//判断是否存在下一个元素

    boolean isFirst();
    boolean isLast();

    Object getCurrentObj();//获取当前游标指向的对象

}

迭代器接口

package com.lp.iterator;

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

//自定义的聚合类
public class ConcerteMyAggregete {
    private List<Object> list = new ArrayList<Object>();

    public void addObject(Object obj){
        this.list.add(obj);
    }

    public void removeObject(Object obj){
        this.list.add(obj);
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    //获得迭代器
    public MyIterator createIterator(){
        return new ConcreteIterator();
    }

    //使用内部类定义迭代器,可以直接使用外部类的属性
    private class ConcreteIterator implements MyIterator{

        private  int cursor; // 定义游标用于记录遍历时的位置

        @Override
        public void first() {
            cursor = 0;
        }

        @Override
        public void next() {
            if(cursor < list.size()){
                cursor ++;
            }
        }

        @Override
        public boolean hasNext() {
            if(cursor < list.size()){
                return true;
            }
            return false;
        }

        @Override
        public boolean isFirst() {
            if(cursor == 0 )
                return true;
            return false;
        }

        @Override
        public boolean isLast() {
            return cursor == (list.size() - 1 )?true:false;
        }

        @Override
        public Object getCurrentObj() {
            return list.get(cursor);
        }

    }
}

聚合类和迭代器

package com.lp.iterator;

public class Client {
    public static void main(String[] args){
        ConcerteMyAggregete cma = new ConcerteMyAggregete();
        cma.addObject("aa");
        cma.addObject("bb");
        cma.addObject("cc");

        MyIterator iter = cma.createIterator();
        while(iter.hasNext()){
            System.out.println(iter.getCurrentObj());
            iter.next();
        }
    }
}

客户端

时间: 2024-10-18 07:19:12

设计模式学习(十三) 迭代器模式的相关文章

Java设计模式学习记录-迭代器模式

前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式

javascript设计模式学习之七——迭代器模式

一.迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,并且不需要暴露该对象的内部表示. 在当前大部分语言中,都已经内置了迭代器模式.迭代器有内部迭代器和外部迭代器之分,一般现有语言中实现的大多是内部迭代器. 二.jquery中的each实现 //类似jquery中的each迭代器 $.each=function(obj,callback){ var value, i=0, isArray=isArrayLike(obj), length=obj.length; if(isA

设计模式学习笔记--迭代器模式

1 using System; 2 3 namespace Iterator 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/30 20:01:24 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// Iterator说明:迭代器抽象类 10 /// </summary> 11 public abstract class Iterator 12 { 13 public abs

《Head first设计模式》学习笔记 – 迭代器模式

代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃的餐厅午餐了.但是,好像有一点小麻烦:新的餐厅想用煎饼屋菜单当作早餐的菜单,使用餐厅的菜单当做午餐的菜单,大家都同意了这样实现菜单项.但是大家无法同意菜单的实现.煎饼屋使用ArrayList记录他的菜单项,而餐厅使用的是数组.他们两个都不愿意改变他们的实现,毕竟有太多代码依赖于它们了. 检查菜单项 让我

C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

设计模式学习之代理模式学习(一)

关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一个程序员的编程思想提升有着很大的帮助.但是设计模式有二十三种,想要全部掌握还是要花点时间的,但如果是只学习常用的几种设计模式还是相对容易的.下面是我学习代理模式的一些心得. 问题引出      什么是代理模式,为什么要用代理模式. 现在有一个场景模拟:有一个tank类,他实现了Moveable接口,Moveable接口中有一个mov

设计模式C++实现——迭代器模式

模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示.把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,也让责任各得其所. 模式结构: Iterator:迭代器定义访问和遍历元素的接口 ConcreteIterator:具体迭代器实现迭代器接口:对该聚合遍历时跟踪当前位置 Aggregate:聚合定义创建相应的迭代器对象接口 ConcreteAggregate:具体聚合实现

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习之外观模式(Facade,结构型模式)(8)

1.什么是外观模式为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2.为什么要使用外观模式在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,从而导致客户程序随着子系统的变化而变化,那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? 现在来考虑这样一个抵押系统,当有一个客户来时,有如下几件事情需要确认:到银行子系统查询他是否有足够多的存款,到信用子系统查询他是否有良好的信