无论是做什么产品,设计模式都是一个非常重要的环节。对不同模式的正确应用不仅仅能加快开发,更能使整个项目拥有清晰的架构,便于后续的发展和维护。
在阅读项目代码的过程中,我一直在问自己,为什么这个地方要这么设计,哪些方法要开放,哪些需要隐藏,哪些需要使用单例,为什么要在这里使用观察。一个优秀的程序员不能仅仅完成任务,应该去思考把代码写的优雅,把产品做的优秀,把自己当作一个设计师i,一个作家,而不是一个工人。
下面是我阅读代码时候对设计模式的一些想法和思考,不正确的地方请多多指教。
MVC。
MVC应该是最为耳熟的设计模式了。MVC指的就是模型,视图,控制器分离。最为理想的MVC设计应该是每一个类都应该有且只有归属到一个部分中。在项目阅读过程中,我发现到MVC的思想无处不在,但到了实际的实施过程中,也有许多很难照顾到的地方。比如IOS中的VC,他究竟应该算在V还是算在C中呢。如果完全将数据源设置抽离出来,开发成本肯定会会加大,对于是否利大于弊,在不同的环境下值得商榷。许多部分在我阅读的过程中,我尝试用MVC的考量去修改代码,但结果并不理想。也就是说,不能生搬硬套MVC思想,而是应该根据具体的情况采取具体的考量。
单例模式。
项目代码中,大量应用了单例模式。在开始的时候,对于单例我是很不明白的,因为之前做的自己的demo都很小,并没有实现到这个部分。在阅读了一些人写的文章关于单例的思考,我才逐渐明白在项目中单例的作用,下面是我看到的一个对于单例解释非常好的一篇文章的部分
单例模式(Singleton)
概念:整个应用或系统只能有该类的一个实例
在iOS开发我们经常碰到只需要某类一个实例的情况,最常见的莫过于对硬件参数的访问类,比如UIAccelerometer.这个类可以帮助我们获得硬件在各个方向轴上的加速度,但是我们仅仅需要它的一个实例就够了,再多,只会浪费内存。
例子。文件管理,侧边栏,弹出提示,网络请求管理,公有方法,缓存,默认设置等等
单例的五个小步
1. 声明一个可以新建和获取单个实例对象的方法
2. 声明一个static类型的类变量
3. 声明一个只执行一次的任务
4. 调用dispatch_once执行该任务指定的代码块,在该代码块中实例化上文声明的类变量
5. 返回在整个应用的生命周期中只会被实例化一次的变量
代码事例
//Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedSingleton; <1>
@end
/***************************************************************/
//Singleton.m
#import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton = nil;<2>
+ (Singleton *)sharedSingleton{
static dispatch_once_t once;<3>
dispatch_once(&once,^{
sharedSingleton = [[self alloc] init];<4>
//dosometing
});
return sharedSingleton;<5>
}
使用单例的目的是有些对象作为整个应用都存在的可以公用的,比如文件管理器,网络管理器,通用的导航栏(侧边栏,下边栏等等)。使用单例可以避免过多的对象生成,节省内存开销。在ios7后一般使用GCD+ARC的形式。
单例对象在整个程序中只有唯一的入口,因此单例的对象都是静态的static,同时,一般我们使用懒加载,即在第一次使用的时候再调用dispatch_once生成。一旦类已经生成了实例,那么生成器再也不会被调用。
观察者模式(KVO)。
又是一个在项目中非常常用的模式,后面会有一篇专门的博客文章来记录自己的一些使用的心得。
键值编码(KVC)
可以简化代码。特别在Json传值中应用的非常多。在像TableView中的数据源设置中也有很多的应用。