iOS开发常用的集中设计模式
2015-10-18 21:13
281 查看
"设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。" ----百度百科
开篇点题 ------
任何理论都需要实例来支撑, 相信也很少有人在码代码之前就要来把各种设计模式了解透彻.
JAVA中为总所周知的设计模式有24种(也有说27种), 同样在iOS中适用且常用的设计模式有6种:
1. 单例模式
2. 委托模式 (代理模式)
3. MVC模式
4. 观察者模式 (KVO, Notification)
5. 策略模式
6. 工厂模式
上面这些设计模式最大的特点就是降低不同类之间的耦合度, 俗称"解耦合". 不同模块之间的代码互相独立, 分工明确, 不会因为相互调用而产生过多依赖.
1. 单例模式
单例模式在项目中通常被用作管理类. 在整个项目中只需要创建一次, 使用时候调用即可.
系统常见单例类有: UIApplication, NSNotificationCenter.
有时候我们自己也需要自定义一个管理用的单例类.
创建一个单例的常用方式:
一个合格的单例类除了一个创建用的类方法外, 通常还需要重写系统的几个构造方法. 如果在MRC模式, 则还需要重写几个构造函数, 重写release, retain, retainCount, copy等和内存管理相关的方法, 以防止引用计数的增减. 不过因为单例类大家都会通过公共的类方法来调用, 实际开发中不写的场合也非常多.
2. 委托模式 (代理模式)
当我们有这样一个需求: 一个页面的事件响应, 需要在另一个页面执行某些操作. 或者一个页面需要向另一个页面传值.
比如添加通讯录, 当我们通过编辑添加了一条通讯录信息, 通常会回到通讯录列表, 这时候需要这个列表进行刷新, 并显示刚添加的那条通讯录.
代理的设置分委托和代理各三步:
委托方:1. 声明协议方法
2. 声明代理属性
3. 调用代理
代理方:1. 设置代理
2. 添加协议
3. 实现代理方法
举个栗子:
其中@optional是指该协议方法并非必须实现。
之后定义delegate属性,该属性的类型为id,即任何遵从协议的对象都可以设置为该代理。
使用判断来保证代理被继承且对应方法已经被实现的时候才调用。
添加对应的协议名称。
实现需要的协议方法。
3. MVC模式
使用Model(模型),View(视图),Controller(控制器)将整个项目功能划分成三个不同的模块,使得项目分工明确,层次清晰,易于维护。
iOS在编程的时候,也经常使用MVC的思想来构筑代码,最明显的就是文件夹的划分。
.... (未完待续
开篇点题 ------
任何理论都需要实例来支撑, 相信也很少有人在码代码之前就要来把各种设计模式了解透彻.
JAVA中为总所周知的设计模式有24种(也有说27种), 同样在iOS中适用且常用的设计模式有6种:
1. 单例模式
2. 委托模式 (代理模式)
3. MVC模式
4. 观察者模式 (KVO, Notification)
5. 策略模式
6. 工厂模式
上面这些设计模式最大的特点就是降低不同类之间的耦合度, 俗称"解耦合". 不同模块之间的代码互相独立, 分工明确, 不会因为相互调用而产生过多依赖.
1. 单例模式
单例模式在项目中通常被用作管理类. 在整个项目中只需要创建一次, 使用时候调用即可.
系统常见单例类有: UIApplication, NSNotificationCenter.
有时候我们自己也需要自定义一个管理用的单例类.
创建一个单例的常用方式:
+ (instancetype)shareUserInfoManager { static XLUserInfoManager *manager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ manager = [[self alloc] init]; }); return manager; }如上, 提供一个类方法创建类, 使用GCD保证这个类只会被创建一次.
一个合格的单例类除了一个创建用的类方法外, 通常还需要重写系统的几个构造方法. 如果在MRC模式, 则还需要重写几个构造函数, 重写release, retain, retainCount, copy等和内存管理相关的方法, 以防止引用计数的增减. 不过因为单例类大家都会通过公共的类方法来调用, 实际开发中不写的场合也非常多.
2. 委托模式 (代理模式)
当我们有这样一个需求: 一个页面的事件响应, 需要在另一个页面执行某些操作. 或者一个页面需要向另一个页面传值.
比如添加通讯录, 当我们通过编辑添加了一条通讯录信息, 通常会回到通讯录列表, 这时候需要这个列表进行刷新, 并显示刚添加的那条通讯录.
代理的设置分委托和代理各三步:
委托方:1. 声明协议方法
2. 声明代理属性
3. 调用代理
代理方:1. 设置代理
2. 添加协议
3. 实现代理方法
举个栗子:
@class BuyBook; @protocol BuyBookDelegate <NSObject> @optional - (void)buyBookComplete:(BuyBook *)buyBook; @end @interface BuyBook : UIView @property (nonatomic, weak) id<BuyBookDelegate> delegate; @end这里声明了一个BuyBook类。在.h文件中声明了BuyBookDelegate协议,并定义了协议方法。
其中@optional是指该协议方法并非必须实现。
之后定义delegate属性,该属性的类型为id,即任何遵从协议的对象都可以设置为该代理。
@implementation BuyBook - (void)buyBook { if ([self.delegate respondsToSelector:@selector(buyBookComplete:)]) { [self.delegate buyBookComplete:self]; } } @end当有程序调用到buyBook方法时候,就执行代理方法。
使用判断来保证代理被继承且对应方法已经被实现的时候才调用。
@interface ViewController () <BuyBookDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; BuyBook * buyBook = [[BuyBook alloc] init]; buyBook.delegate = self; } - (void)buyBookComplete:(BuyBook *)buyBook { NSLog(@"buy book complete!"); }在使用这个类的时候,需要设置对象的delegate属性为self。
添加对应的协议名称。
实现需要的协议方法。
3. MVC模式
使用Model(模型),View(视图),Controller(控制器)将整个项目功能划分成三个不同的模块,使得项目分工明确,层次清晰,易于维护。
iOS在编程的时候,也经常使用MVC的思想来构筑代码,最明显的就是文件夹的划分。
.... (未完待续
相关文章推荐
- IOS沙盒中的Documents、Library、tmp区别
- IOS开发中常用一下方法
- iOS Block总结
- iOS开发:创建真机调试证书
- ios开发常用英文单词总结
- iOS编程101:如何创建圆形头像和圆角图片
- IOS开发—IB_Designable & IBInspectable介绍
- iOS中 SDWebImage手动清除缓存的方法 技术分享
- iOS中 SDWebImage手动清除缓存的方法 技术分享
- iOS百度地图定位功能iOS8+
- ios 生成随机数
- iOS 中常用的遍历方法
- ios学习之pickerview的使用
- [iOS]ARC和MRC下的单例
- IOS学习笔记 - NSFileManager,沙盒路径,NSString类路径处理,NSCache,读取文件头判断图片类型
- iOS 键盘通知 与 键盘上方工具条设置
- IOS 关于layoutSubviews摘记
- IOS9 适配
- iOS编程之Address Book (1)
- iOS Document Interaction 编程指南