Iterator - 迭代器模式
定义

template<class Item>class AbstractList {public:virtual Iterator* createIterator() const = 0;virtual int count() const = 0;virtual void append(Item item) = 0;virtual void remove(Item item) = 0;virtual void get(Int index) = 0;
};
template<class Item>class ListOne : public AbstractList {public:virtual Iterator* createIterator() const;...};Iterator* ListOne::createIterator() {return new IteratorOne<Item>(this);}
template<class Item>class Iterator {public:virtual void first() = 0;virtual void next() = 0;virtual bool isEnd() const = 0;virtual Item current() const = 0;proteced:Iterator();};
template<class Item>class IteratorOne : public Iterator {public:IteratorOne(const ListOne<Item>* list);virtual void first();virtual void next();virtual bool isEnd() const;virtual Item current() const;private:ListOne<Item>* m_list;int m_index;};template<class Item>void IteratorOne::first() {m_index = 0;}template<class Item>void IteratorOne::next() {++m_index;}template<class Item>bool IteratorOne::isEnd() const {return m_index == m_list->count();}tempalte<class Item>Item IteratorOne::current() const {if(isEnd())throw IteratorOutOfBounds();return m_list->get(m_index);}
ListOne<Book*> books;IteratorOne<Book*>* iter = books.createIterator();for(iter->first(); !iter->isEnd(); iter->next()) {std::cout << iter->current()->print();}delete iter;
template<class Item>class IteratorPtr {public:IteratorPtr(Iterator<Item>* iter) : m_iter(iter) {}~IteratorPtr() { delete m_iter; }Iterator<Item>* operator->() { returm m_iter; }Iterator<Item>* operator*() { return *m_iter; }private:Iterator<Item>* m_iter;}
ListOne<Book*> books;IteratorPtr<Book*> iter(books.createIterator());for(iter->first(); !iter->isEnd(); iter->next()) {std::cout << iter->current()->print();}
template<class Item>class ListTraverser {public:ListTravrerser(ListOne<Item>* list);void traverse();proteced:virtual void processItem(const Item&) = 0;private:IteratorOne<Item> m_iter;};void ListTraverser::traverse() {bool result = false;for(m_iter.first(); !m_iter.isEnd(); m_iter.next()) {processItem(m_item.current());}}
void BookTraverse::processItem(const Book* book) {cout << book;}
List<Book> books;BookTraverse bt(books);bt.traverse();
- 訪问一个集合对象的内容而无须要暴露它的内部展示
- 支持对集合对象的多种遍历
- 为遍历不同的集合结构提供一个统一的接口
Iterator - 迭代器模式的更多相关文章
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- 设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- 设计模式(16)--Iterator(迭代器模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 迭代模式又叫游标(Cursor)模式,是对象的行为模式.迭代模式可以顺序地访问一个聚集中的元素而不 ...
- Iterator 迭代器模式 MD
迭代器模式 简介 Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问[委让]给外部类,使用Iterator按顺序进行遍历访问. 在程序设计中,经常有这种情况:需要从大量的数据集合中一 ...
- [C++设计模式] iterator 迭代器模式
迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
14.1.解释 概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. main(),客户 IProject,产品接口 CProject,产品类 IIterator,迭代 ...
- Iterator(迭代器模式)--(超市管理者)
这个Iterator就是收银台干的活. package patterns.actions.iterator; public interface IteratorList { boolean isEmp ...
随机推荐
- netty支持SSL,OpenSSL
import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.handler ...
- 基于Myeclipse+Axis2的WebService开发实录
最近开始学习了下在Myeclipse开发工具下基于WebSerivce的开发,下面将相关相关关键信息予以记录 Myeclipse的安装,本文以Myeclipse2014-blue为开发环境,相关配置执 ...
- python 13:数字列表统计方法(min(list)、max(list)、sum(list))
numbers = list(range(1,11)) print(numbers) print(min(numbers)) #获得列表最小值 print(max(numbers)) #获得列表最大值 ...
- B - Alyona and mex(构造)
Problem description Alyona's mother wants to present an array of n non-negative integers to Alyona. ...
- C#Cookie操作类,删除Cookie,给Cookie赋值
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security ...
- SQL连接其它服务器操作
Exec sp_droplinkedsrvlogin ZYB,Null --删除映射(录与链接服务器上远程登录之间的映射) Exec sp_dropserver ZYB --删除远程服务器链接 EXE ...
- 通过Web Service实现IP地址查询功能
实例01 实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文件 ...
- 关于Core里的 StartUp里的方法的理解。
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; ...
- js 验证文件格式和大小
<script> $('#btnSearch').click(function(){ // alert("000");// fileElem = document.ge ...
- RN-第三方之react-native-pull 下拉刷新、上拉加载
有一个很好的下拉刷新.上拉加载库:react-native-pull地址:https://github.com/greatbsky/react-native-pull-demo 使用 import { ...