[Python设计模式] 第20章 挨个买票——迭代器模式
github地址:https://github.com/cheesezh/python_design_patterns
迭代器模式
迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示[DP]。
当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。
当需要对聚集有多种方式遍历时,也可以考虑使用迭代器模式。
迭代器为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一项等统一接口。
from abc import ABCMeta, abstractmethod
class Iterator():
"""
迭代器抽象类,定义得到开始对象,得到下一对象,判断是否结尾,得到当前对象等方法
"""
__metaclass__ = ABCMeta
@abstractmethod
def first(self):
pass
@abstractmethod
def next(self):
pass
@abstractmethod
def is_done(self):
pass
@abstractmethod
def current_item(self):
pass
class Aggregate():
"""
聚集抽象类
"""
__metaclass__ = ABCMeta
@abstractmethod
def create_iterator(self):
pass
class ConcreteIterator(Iterator):
"""
具体迭代器类
"""
def __init__(self, aggregate):
# 定义一个具体的聚集对象,初始化时将具体的聚集对象传入
self.aggregate = aggregate
self.current = 0
def first(self):
# 得到聚集的第一个对象
return self.aggregate.get_value(0)
def next(self):
# 得到聚集的下一个对象
ret = None
self.current += 1
if self.current < self.aggregate.length:
ret = self.aggregate.get_value(self.current)
return ret
def is_done(self):
return True if self.current >= self.aggregate.length else False
def current_item(self):
return self.aggregate.get_value(self.current)
class ConcreteAggregate(Aggregate):
"""
具体聚集类
"""
def __init__(self):
self.list = []
self.length = 0
def create_iterator(self):
return ConcreteIterator(self)
def create_iterator_desc(self):
return ConcreteIteratorDesc(self)
def insert_value(self, value):
self.list.append(value)
self.length += 1
def get_value(self, index):
return self.list[index]
def main():
agg = ConcreteAggregate()
agg.insert_value("aa")
agg.insert_value("bb")
agg.insert_value("cc")
agg.insert_value("dd")
agg.insert_value("ee")
i = agg.create_iterator()
item = i.first()
while i.is_done() == False:
print("{} 买车票".format(i.current_item()))
i.next()
main()
aa 买车票
bb 买车票
cc 买车票
dd 买车票
ee 买车票
逆序遍历
class ConcreteIteratorDesc(Iterator):
"""
具体迭代器类,逆序遍历
"""
def __init__(self, aggregate):
# 定义一个具体的聚集对象,初始化时将具体的聚集对象传入
self.aggregate = aggregate
self.current = self.aggregate.length-1
def first(self):
# 得到聚集的第一个对象
return self.aggregate.get_value(self.aggregate.length-1)
def next(self):
# 得到聚集的下一个对象
ret = None
self.current -= 1
if self.current >= 0:
ret = self.aggregate.get_value(self.current)
return ret
def is_done(self):
return True if self.current < 0 else False
def current_item(self):
return self.aggregate.get_value(self.current)
def main():
agg = ConcreteAggregate()
agg.insert_value("aa")
agg.insert_value("bb")
agg.insert_value("cc")
agg.insert_value("dd")
agg.insert_value("ee")
i = agg.create_iterator_desc()
item = i.first()
while i.is_done() == False:
print("{} 买车票".format(i.current_item()))
i.next()
main()
ee 买车票
dd 买车票
cc 买车票
bb 买车票
aa 买车票
点评
总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。
[Python设计模式] 第20章 挨个买票——迭代器模式的更多相关文章
- [Python设计模式] 第24章 加薪审批——职责链模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下情景 员工向经理发起加薪申请,经理无权决定,需要向总监汇报, ...
- [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
github地址:https://github.com/cheesezh/python_design_patterns 简单工厂模式 v.s. 工厂方法模式 以简单计算器为例,对比一下简单工厂模式和工 ...
- [Python设计模式] 第28章 男人和女人——访问者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下不同情况: 男人成功时,背后多半有一个伟大的女人: 女人成功 ...
- [Python设计模式] 第18章 游戏角色备份——备忘录模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟以下场景,一个游戏角色有生命力,攻击力,防御力等数据,在打Bos ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用
迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- [Python设计模式] 第26章 千人千面,内在共享——享元模式
github地址:https://github.com/cheesezh/python_design_patterns 背景 有6个客户想做产品展示网站,其中3个想做成天猫商城那样的"电商风 ...
随机推荐
- 学习Spring必须了解的基础知识——回调机制
上面这张图如果能看得懂就能理解什么是回调机制: A对象在调用a()方法时会调用B对象的b()方法,b()方法必须能调用A对象的callback()方法. 谁白了:a()方法有B对象b()方法的引用,b ...
- 【目录】《剑指Offer》Java实现
如题: 1) 找出数组中重复的数字 2) 不修改数组找出重复的数字 3) 二维数组中的查找 4) 替换空格 5) 从尾到头打印链表 6) 重建二叉树 7) 二叉树的下一个结点 8) 用两个栈实现队列 ...
- busybox linux-2.6.2 编译安装中碰到的若干问题
Q1 /busybox-1.18.4/scripts/gcc-version.sh: line 11: arm-linux-gcc: command not found 1.问题:/home/ub ...
- 斐波那契数列-java编程:三种方法实现斐波那契数列
题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...
- 修改tp5的默认配置文件的位置
web |--application | |--admin | |--home | | |--controller | | |--model | | |--view | | |--extra 5.01 ...
- python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)
阅读目录 一.Selenium介绍 二.爬虫为什么要用selenium? 三.PhantomJS介绍 四.PhantomJS安装 五.操作实战 六.在此推荐虫师博客的学习资料 selenium + p ...
- POJ2387 Til the Cows Come Home【Kruscal】
题目链接>>> 题目大意: 谷仓之间有一些路径长度,然后要在这些谷仓之间建立一些互联网,花费的成本与长度成正比,,并且要使这些边连起来看的像一课“树”,然后使成本最大 解题思路: 最 ...
- Area POJ - 1265 -皮克定理-叉积
Area POJ - 1265 皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为2S=2a+b-2, 其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积. ...
- csrf_token 跨站请求设置
$.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); <form> {% csrf_token %} &l ...
- Django基础(四)
Django-4 知识预览 分页器(paginator) COOKIE 与 SESSION Django的用户认证 FORM 回到顶部 分页器(paginator) 分页器的使用 1 2 3 4 5 ...