迭代子模式

'''
ITERATOR——迭代子模式?
  我爱上了Mary,不顾一切的向她求婚。   Mary:“想要我跟你结婚,得答应我的条件”   我:“什么条件我都答应,你说吧”   Mary:“我看上了那个一克拉的钻石”   我:“我买,我买,还有吗?”   Mary:“我看上了湖边的那栋别墅”   我:“我买,我买,还有吗?”   Mary:“我看上那辆法拉利跑车”   我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”   ……  
  迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。  


提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。


适用场景:


访问一个聚合对象的内容而无需暴露它的内部表示。
支持对聚合对象的多种遍历。
为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)
实现方法:__iter__、__next__


'''
# class LinkList(object):
#     """链表 头结点保存链表的长度"""
#
#     class Node(object):
#         def __init__(self,item=None):
#             self.item=item
#             self.next=None
#
#     class  LinkListIterator(object):
#         def __init__(self,node):
#             self.node=node
#
#         def __next__(self):
#             if self.node:
#                 cur_node = self.node
#                 self.node=cur_node.next
#                 return cur_node.item
#
#
#         def __iter__(self):
#             return self
#
#     def __init__(self,iterable=None):
#         self.head=LinkList.Node(0)
#         self.tail=self.head
#         self.extend(iterable)
#
#     def append(self,obj):
#         s=LinkList.Node(obj)
#         self.tail.next=s
#         self.tail=s
#         self.head.item +=1
#
#     def extend(self,iterable):
#         for obj in iterable:
#             self.append(obj)
#     def __iter__(self):
#         return self.LinkListIterator(self.head.next)
#     def __len__(self):
#         return self.head.item
#
#     def __str__(self):
#         return "<<"+",".join(map(str,self))+">>"
#
# li= [i for i in range(100)]
# Lk=LinkList(li)
# print(Lk)
class LinkList:
    """链表 头结点保存链表的长度"""


    class Node:
        def __init__(self, item=None):
            self.item = item
            self.next = None


    class LinkListIterator:
        def __init__(self, node):
            self.node = node


        def __next__(self):
            if self.node:
                cur_node = self.node
                self.node = cur_node.next
                return cur_node.item
            else:
                raise StopIteration


        def __iter__(self):
            return self


    def __init__(self, iterable=None):
        self.head = LinkList.Node(0)
        self.tail = self.head
        self.extend(iterable)


    def append(self, obj):
        s = LinkList.Node(obj)
        self.tail.next = s
        self.tail = s
        self.head.item += 1


    def extend(self, iterable):
        for obj in iterable:
            self.append(obj)


    def __iter__(self):
        return self.LinkListIterator(self.head.next)


    def __len__(self):
        return self.head.item


    def __str__(self):
        return "<<" + ", ".join(map(str, self)) + ">>"




li = [i for i in range(100)]
lk = LinkList(li)
print(lk)


# print(str(b"汉子"))

猜你喜欢

转载自blog.csdn.net/weixin_42040854/article/details/80612916