- 代理模式
使用场景:一个类的某些功能需要其他类来实现,只要遵循了规定协议的类就可以实现这些功能;
例子:典型例子 UITableView的dataSource和delegate
自定义delegate 单例模式
使用场景:在一个项目中只需要一个类的同一个实例,而且需要这个实例共享一些资源
在C#、java、C++中的实现方式是私有化类的构造函数,然后在重写一个创建实例的公有方法,而在Objective-C中是在allocWithZone中通过使用多线程中都只执行一次的方法dispatch_once来创建对象。
UIAccelerometer的实例化方法+sharedAcceleromete;UIApplication类提供了 +sharedAPplication方法创建和获取UIApplication单例 NSBundle类提供了 +mainBunle方法获取NSBundle单例 NSFileManager类提供了 +defaultManager方法创建和获得NSFileManager单例。(PS:有些时候我们得放弃使用单例模式,使用-init方法去实现一个新的实例,比如使用委托时) NSNotificationCenter提供了 +defaultCenter方法创建和获取NSNotificationCenter单例(PS:该类还遵循了另一个重要的设计模式:观察者模式) NSUserDefaults类提供了 +defaultUserDefaults方法去创建和获取NSUserDefaults单例
观察者模式
使用场景:一个类想要让某些类接收本类提前创建好的通知,而谁来接收通知是由接受者自己决定,如果该类想接收这个通知,这个类就必须向通知中心添加通知监听,这就好比是订阅报纸一样
例子:1.创建一个NSNotification,并添加到通知中心,2.需要接收通知的对象,就告诉NSNotificationCenter,我需要这个通知,并且做一些操作。
[[NSNotificationCenter defaultCenter]postNotificationName:@”APPTerminate” object:self];
}[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doSomething:) name:@”APPTerminate” object:nil];
KVO也是一种特殊的观察者模式。
使用方法:[被观察对象 addObserver:观察者 forKeyPath: 被观对象的属性名 options: NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context: @”pass content” ];
对象属性一改变,调用这个方法,
- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void *)context{
NSLog(@”state change:%@”,change);
}
change参数是包含了新值和旧值的 一个字典
{
kind = 1;
new = @“”;
old = @“”;
}
4. 工厂模式
应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
敏捷原则:DIP依赖倒置原则
实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换
注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显,
增 加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。
5. 策略模式
使用场景:定义算法簇。将算法封装起来,只提供外界接口调用就行;
实例:排序算法,NSArray的sortedArrayUsingSelector
6. MVC模式
应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进 行逻辑划分。
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。