GoF23种设计模式之行为型模式之迭代器模式
2024-08-31 14:15:06
一、概述
给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候。
2.当对聚合对象的多种遍历提供支持的时候。
3.当为了遍历不同的聚合结构提供一个统一的接口的时候(多态迭代)。
三、参与者
1.Iterator:迭代器定义访问和遍历元素的接口。
2.ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3.Aggregate:聚合定义创建相应迭代器对象的接口。
4.ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
四、类图
五、示例
Iterator
- package cn.lynn.iterator;
- public interface Iterator {
- public void first();
- public void last();
- public boolean hasNext();
- public Object next();
- }
ConcreteIterator
- package cn.lynn.iterator;
- public class IteratorImpl implements Iterator {
- private List list;
- private int index;
- public IteratorImpl(List list) {
- index = 0;
- this.list = list;
- }
- @Override
- public void first() {
- index = 0;
- }
- @Override
- public void last() {
- index = list.getSize();
- }
- @Override
- public boolean hasNext() {
- return index < list.getSize();
- }
- @Override
- public Object next() {
- Object obj = list.get(index);
- index++;
- return obj;
- }
- }
Aggregate
- package cn.lynn.iterator;
- public interface List {
- public Iterator iterator();
- public Object get(int index);
- public int getSize();
- public void add(Object obj);
- }
ConcreteAggregate
- package cn.lynn.iterator;
- public class ListImpl implements List {
- private Object[] objArr;
- private int index;
- private int size;
- public ListImpl() {
- index = 0;
- size = 0;
- objArr = new Object[50];
- }
- @Override
- public Iterator iterator() {
- return new IteratorImpl(this);
- }
- @Override
- public Object get(int index) {
- return objArr[index];
- }
- @Override
- public int getSize() {
- return size;
- }
- @Override
- public void add(Object obj) {
- objArr[index++] = obj;
- size++;
- }
- }
Client
- package cn.lynn.iterator;
- public class Client {
- public static void main(String[] args) {
- List list = new ListImpl();
- list.add("张三");
- list.add("李四");
- list.add("王五");
- Iterator iterator = list.iterator();
- while (iterator.hasNext()) {
- System.out.println(iterator.next());
- }
- System.out.println("********");
- for (int i = 0; i < list.getSize(); i++) {
- System.out.println(list.get(i));
- }
- }
- }
Result
- 张三
- 李四
- 王五
- ********
- 张三
- 李四
- 王五
最新文章
- 数据库mysql 基本命令
- [Java] 位运算
- DevExpress组件之——PopupMenu组件(转)
- xshell linux传文件
- C++实现多线程类Thread
- 什么是 docker?
- 自己动手写PHP MVC框架
- margin 还能够被缩回
- Apache Hadoop 2.0.2-alpha
- 基于puppeteer模拟登录抓取页面
- 单链表sLinkList类,模板类
- HTML5智能表单
- Jenkins进阶-Git多仓库代码下载编译 (13)
- 闲聊jQuery(一)
- tomcat报错catalina.sh: line 401: /usr/java/jdk1.7.52/bin/java: No such file or directory
- 安装express并创建工程
- php中explode和implode函数
- 【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]
- bzoj 4006 [JLOI2015]管道连接——斯坦纳树
- 学习一份百度的JavaScript编码规范
热门文章
- Uva10755
- oracle中CAST函数使用简介【转】
- 牛客网Java刷题知识点之什么是匿名内部类、匿名内部类的使用原则、匿名内部类初始化、匿名内部类使用的形参为何要为final 和 案例
- springmvc httprequest 使用@Autowired注解
- Mysql一个表编码的坑,mark一下
- CoreDataDemo
- Linux shell标准输入,标准输出,错误输出
- Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)
- Android商城开发系列(九)—— 首页频道布局的实现
- python基础教程总结7——异常