iOS开发-迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望遍历的对象内部存储结构被外部知道,那么可以将对象包装成一个迭代器,迭代器中定义中遍历对象的方法下一个,是否存在下一个对象,删除等遍历需要的统一接口,迭代器在Java和.NET使用的比较多,自定义实现叶非常简单,可以简单的看一下迭代器模式的UML类图。
迭代器定义基本的遍历操作方法,容器定义公共的创建迭代器的方法,子类负责实现具体需要引用的迭代器,我们可以假设图书馆是一个抽象容器,图书馆下面分为国家图书馆和个人图书馆,个人图书馆存储书籍的方式是可变数组存储书籍,国家图书馆数据存储书籍,分别创建不同的迭代器;
BookLibrary容器接口:
@protocol BoolLibraryProtocol<NSObject> @optional
-(Iterator *)createIterator; @end @interface BookLibrary : NSObject<BoolLibraryProtocol> @end
CountryBookLibrary国家图书馆:
@interface CountryBookLibrary() @property (strong,nonatomic) NSArray *bookArr; @end @implementation CountryBookLibrary - (instancetype)init
{
self = [super init];
if (self) {
Book *one=[self addBook:@"CountryBookLibrary" price:10];
Book *next=[self addBook:@"博客园-FlyElephant" price:20];
self.bookArr=@[one,next];
}
return self;
} -(Iterator *)createIterator{
return [[CountryIterator alloc]initWithData:self.bookArr];
} -(Book *)addBook:(NSString *)bookName price:(float)price{
Book *book=[[Book alloc]init];
book.bookName=bookName;
book.price=price;
return book;
} @end
PersonLibraryBook个人图书馆:
@interface PersonBookLibray() @property (strong,nonatomic) NSMutableArray *books; @end @implementation PersonBookLibray - (instancetype)init
{
self = [super init];
if (self) {
[self addBook:@"PersonIterator" price:100];
[self addBook:@"博客园-FlyElephant" price:200];
}
return self;
} -(Iterator *)createIterator{
return [[PersonIterator alloc]initWithData:self.books];
} -(void)addBook:(NSString *)bookName price:(float)price{
Book *book=[[Book alloc]init];
book.bookName=bookName;
book.price=price;
[self.books addObject:book];
} #pragma mark - getter and setter
-(NSMutableArray *)books{
if (!_books) {
_books=[[NSMutableArray alloc]init];
}
return _books;
} @end
迭代器Iterator:
@protocol IteratorProtocol <NSObject> @optional
-(Boolean)hasNext; @optional
-(id)next; @end @interface Iterator : NSObject<IteratorProtocol> @end
国家图书馆引用的迭代器:
@interface CountryIterator() @property (strong,nonatomic) NSArray *arr;
@property (assign,nonatomic) NSInteger position; @end @implementation CountryIterator -(instancetype)initWithData:(NSArray *)data{
self=[super init];
if (self) {
self.arr=data;
}
return self;
} -(Boolean)hasNext{
if (self.position>=[self.arr count]||!self.arr[self.position]) {
return false;
}else{
return true;
}
} -(id)next{
Book *book=self.arr[self.position];
self.position+=1;
return book;
} @end
个人图书馆引用的迭代器:
@interface PersonIterator() @property (assign,nonatomic) NSInteger position;
@property (strong,nonatomic) NSMutableArray *mutableArr; @end @implementation PersonIterator -(instancetype)initWithData:(NSMutableArray *)data{
self=[super init];
if (self) {
self.mutableArr=data;
}
return self;
} -(Boolean)hasNext{
if (self.position>=[self.mutableArr count]||![self.mutableArr objectAtIndex:self.position]) {
return false;
}else{
return true;
}
} -(id)next{
Book *book=[self.mutableArr objectAtIndex:self.position];
self.position+=1;
return book;
} @end
实际调用:
-(void)iteratorDesign{
BookLibrary *personLibrary=[[PersonBookLibray alloc]init];
Iterator *personIterator=[personLibrary createIterator];
[self logLibraryInfo:personIterator]; BookLibrary *countryLibrary=[[CountryBookLibrary alloc]init];
Iterator *countryIterator=[countryLibrary createIterator];
[self logLibraryInfo:countryIterator];
} -(void)logLibraryInfo:(Iterator *)iterator{
while ([iterator hasNext]) {
Book *book=[iterator next];
NSLog(@"书名:%@--价格:%ld",book.bookName,book.price);
}
}
测试结果:
迭代器模式的优点:支持以不同的方式遍历一个聚合对象(不同的聚合对象不同的遍历方式),迭代器简化了聚合类(统一接口),在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码(假设新增字典迭代器,直接添加就行,符合对扩展开放,对修改关闭的原则0)
缺点: 迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。不过集合类型总共就几种,基本上系统使用没有问题,个人使用的需注意一下;
iOS开发-迭代器模式的更多相关文章
- iOS开发-代理模式
代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...
- iOS开发-命令模式
命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...
- iOS开发-工厂模式
工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式.简单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory me ...
- iOS开发-状态模式
状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...
- iOS开发——工厂模式
工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...
- iOS开发-模板方法模式
模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...
- iOS开发-策略模式
策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
- iOS开发——swift精讲&MVC应用实战
MVC应用实战 iOS开发中设计模式是很重要的,其中,使用最多的就是MVC模式,今天就简单介绍一下在Swift中这么使用MVC模式来实现我们想要的功能: 模型-视图-控制器(Model-View-Co ...
- 通知模式实现两个textField传值及模态视图——iOS开发
通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...
随机推荐
- html里文本编辑器如何制作呢?
初入it职场,文本编辑器真的让人捉摸不透.最终在前端姐姐帮助下弄好了↓ 先在头部写好编辑器的各种功能的总体模型 <script>var editor; KindEditor.ready(f ...
- jQuery2
一.类型选择器 jQuery的类型选择器 选择器 说明 :button 选择所有按钮 :checkbox 选择所有复选框 :file 选择所有文件上传输入框 :header 选择所有标题元素(h1,h ...
- Selenium2+python自动化2-pip降级selenium3.0
selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium默默的升级到了3.0,然而网上的教程都是 ...
- 关于Android中混淆的问题
1.签名打包后库依赖报错,提示找不到依赖库的方法. 原因:混淆,依赖库的方法被混淆了. 解决方法:过滤混淆,即不要混淆这依赖库的文件. -keep class de.greenrobot.event. ...
- Oracle基础知识笔记
1.打开oracle相关服务 2.创建Oracle用户 create user 用户名 identified by 密码;(需要dba角色创建) 3.权限管理 (1)添加权限 grant 权限.角色 ...
- 最近在研究备份和虚拟磁带库(LEGATO + MHVTL + SCST + LanFree)
最近在研究备份和虚拟磁带库(LEGATO + MHVTL + SCST + LanFree) 有些小成功,MHVTL已经搞定,SCST + LANFREE 正在继续实验中,接着就是LEGATO. 最终 ...
- python profile
一.profile,cProfile 1. python -m cProfile myprogram.py python -m profile myprog.py2. 使用import profile ...
- 初入Cocos2d-x 2.2
下载2.2,用迅雷离线下载很快搞定. 解压后,打开cocos2d-win32.vc2012.sln,编译,超慢,20分钟才完事. 然后想创建一个新项目,需要用到python,用python3.3运行脚 ...
- VPN断线原因解析- ADSL惹的祸
在我们使用VPN的时候,最讨厌的就是无故的断线了,可能正在和好基友一起副本,或者正在视频热聊中,还或者youtube视频看的正起劲,突然windows一个对话框弹出 - “连接已经断开”.实在是太影响 ...
- HTML之表单元素
A.表单元素都是放在<form></form>标签内的.来看看表单的属性 属性 值 描述 accept MIME_type 规定通过文件上传来提交的文件的类型 accept- ...