从王者荣耀看设计模式(十一.迭代器模式)

本文通过王者荣耀的例子介绍了设计模式中的迭代器模式,该模式允许在不暴露内部结构的情况下遍历聚合对象。在王者荣耀中,通过创建不同的迭代器,如在线玩家迭代器和离线玩家迭代器,用户可以方便地访问和遍历QQ/微信好友的游戏状态。迭代器模式简化了聚合类,支持多种遍历方式,且符合面向接口编程的原则。同时,文章展示了迭代器模式的通用类图、角色和代码实现,以及其实现在线和离线玩家信息遍历的示例。

##从王者荣耀看设计模式(迭代器模式)

一.简介

王者荣耀是一款支持多人协同竞技的游戏,支持QQ/微信登陆。在王者荣耀中,可以通过游戏列表查看QQ/微信好友的状态,以便判断是否邀请好友加入游戏

二.模式动机

一个聚合对象,应该提供一种方法让别人可以访问它的元素,而又不需要暴露它的内部结构。此外,针对不同的需要,可能要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口充斥着不同遍历的操作。
怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式。这就是迭代器模式要解决的问题。假设在上图中在线状态的玩家信息在系统内部以数组形式存储,离线玩家信息以集合形式存储,可以通过
创建两种迭代器模式给用户提供统一的接口。

三.迭代器模式

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor).迭代器模式是一种对象行为型模式。

  • 迭代器模式的使用场景
  1. 访问一个聚合对象的内容而无须暴露它的内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部实现细节
  2. 需要为聚合对象提供多种遍历方式
  3. 为遍历不同的聚合结构提供一个统一的接口。当需要扩展聚合结构或者给聚合结构增加新的遍历方式时可以使用迭代器模式,它提供了聚合结构和迭代器的抽象定义
  • 迭代器模式涉及的设计原则有:
  1. 为了交互对象之间的松耦合而努力
  2. 一个类应该只有一个引起变化的原因
  3. 针对接口编程,而不是针对实现编程
  • 迭代器模式的通用类图

  • 迭代器模式所涉及的角色有:
    Iterator(抽象迭代器类):抽象迭代器定义了访问和遍历元素的接口,一般声明以下方法:用于获取第一元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem(),在其子类中将实现这些方法
    ConcreteIterator(具体迭代器类):具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历,同时在对聚合对象进行遍历时跟踪其当前位置
    Aggregate(抽象聚合类):抽象聚合类用于存储对象,并定义创建相应迭代器的接口,声明一个createIterator()方法用于创建一个迭代器对象
    ConcreteAggregate(具体聚合类):具体聚合类实现了创建相应迭代器的接口,实现了在聚合类中声明的createIterator()方法,该方法返回一个与该聚合相应的具体迭代器ConcreteIterator实例

  • 迭代器模式的优点

  1. 它支持以不同的方式遍历一个聚合对象。对于复杂的聚合对象可用多种方法来进行遍历,在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,也可以自己定义迭代器的子类以支持新的遍历方式
  2. 迭代器简化了聚合类。因为引入了迭代器。在原有的聚合对象中不需要再自行提供遍历等数据操作方法,这样可以简化聚合类的设计
  3. 在同一个聚合中可以有多个遍历。 由于每个迭代器都保持自己的遍历状态,因此可以同时对一个聚合对象进行多个遍历操作
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足"开闭原则"
  • 迭代器模式的缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

四.结构图</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值