Py设计模式-迭代器模式

迭代器模式:提供一种方法顺序地访问一组聚合对象(一个容器)中的各个元素,而又不需要暴露该对象的内部细节

迭代器就是一个指向当前元素的指针,这个指针可以返回当前所指向的元素,可以移动到下一个元素,通过这个指针可以遍历容器总的所有元素。


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值