迭代器模式:提供一种方法顺序地访问一组聚合对象(一个容器)中的各个元素,而又不需要暴露该对象的内部细节
迭代器就是一个指向当前元素的指针,这个指针可以返回当前所指向的元素,可以移动到下一个元素,通过这个指针可以遍历容器总的所有元素。
class Customer:
"""顾客"""
def __init__(self,name):
self.__name = name
self.__num = 0
self.__clinics = None
def getName(self):
return self.__name
def register(self,system):
system.pushCustomer(self)
def setNum(self,num):
self.__num = num
def getNum(self):
return self.__num
def setClinic(self,clinic):
self.__clinics = clinic
def getClinic(self):
return self.__clinics
class NumberIterator:
def __init__(self,customer):
self.__data = customer
self.__currentIndex = -1
def next(self):
"""移动到下一个元素"""
if(self.__currentIndex<len(self.__data)-1):
self.__currentIndex+=1
return True
else:
return False
def currentData(self):
return self.__data[self.__currentIndex] if(self.__currentIndex<len(self.__data) and self.__currentIndex>=0)else None
class NumberSystem:
"""排号系统给"""
__clinics=("1号诊室","2号诊室","3号诊室")
def __init__(self,name):
self.__customer =[]
self.__curNum = 0
self.__name = name
def pushCustomer(self,customer):
customer.setNum(self.__curNum+1)
clinik = NumberSystem.__clinics[self.__curNum % len(NumberSystem.__clinics)]
customer.setClinic(clinik)
self.__curNum += 1
self.__customer.append(customer)
print("%s 你好!你已经在%s成功挂号,序号:%d" % (customer.getName(),self.__name,customer.getNum()))
def getIterator(self):
return NumberIterator(self.__customer)
def test():
numberSys = NumberSystem("挂号处")
AAA = Customer("AAA")
AAA.register(numberSys)
BBB = Customer("BBB")
BBB.register(numberSys)
CCC = Customer("CCC")
CCC.register(numberSys)
DDD = Customer("DDD")
DDD.register(numberSys)
iterator = numberSys.getIterator()
while(iterator.next()):
customer = iterator.currentData()
print("下一位患者%04d(%s)请到%s就诊"%(customer.getNum(),customer.getName(),customer.getClinic()))
test()
运行结果:
AAA 你好!你已经在挂号处成功挂号,序号:1
BBB 你好!你已经在挂号处成功挂号,序号:2
CCC 你好!你已经在挂号处成功挂号,序号:3
DDD 你好!你已经在挂号处成功挂号,序号:4
下一位患者0001(AAA)请到1号诊室就诊
下一位患者0002(BBB)请到2号诊室就诊
下一位患者0003(CCC)请到3号诊室就诊
下一位患者0004(DDD)请到1号诊室就诊
aaa