"设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。" ----百度百科
开篇点题 ------
任何理论都需要实例来支撑, 相信也很少有人在码代码之前就要来把各种设计模式了解透彻.
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的思想来构筑代码,最明显的就是文件夹的划分。
.... (未完待续