我们在学习iOS程序开发的时候,经常会听说 代理模式/适配器模式。。。那么到底什么事设计模式呢,我在一开始也是很迷糊的,其实设计模式是面向对象编程的一种设计思想,是通过经验把解决某一类问题的方法的总结。
一, 常见的设计模式
(一)代理模式
需求分析:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
委托(delegate)也叫代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。
优缺点:降低耦合度(耦合度 是一个抽象的名词 就是对某一件事的相关性 相关性越小 对象A改变对对象B的影响最小)
(二)观察者模式
需求分析:某一事件改变对多处有影响 一处改变 多次影响
实现逻辑:
Notification通知中心
Notification通知 具体实现逻辑:
- 1,注册通知:addObserver
- 1 @selector(callBack)
- 2- (void)callBack{是发生通知之后要处理的函数}
- 2,发送通知:postNotificationName
- 接收通知
第一步,首先定义回调,即发生通知了我应该做啥事。
- (void)callBack{
NSLog(@"我收到通知了!");
}
第二步,注册通知,这里处理一些事件(事件改变就该发送通知 比如团购项目地区《北京》 切换到《广州》 地区发生改变 就需要发送通知 切换到请求广州地区的数据)这里的地区就是我们通知关注的事件
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(callBack)
name: @"这里是自定义通知的名字 在触发通知 事件处理 都是通过这个名字 下面就是发送通知"
object: nil];
第三部,发送通知,就是需要处理通知的地方 接收通知 然后做相应改变
//
- (void)getNotofocation{
NSLog(@"获取通知");
//发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"这里是自定义通知的名字 在触发通知 事件处理 都是通过这个名字" object:self];
}
(三)MVC模式
实现逻辑:
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
优势:使系统,层次清晰,职责分明,易于维护
(四)单例模式
需求分析:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
实现逻辑:
- 1,为单例对象实现一个静态实例,并初始化,然后设置成nil
- 1 static SurveyRunTimeData *sharedObj = nil
- 2,实现一个实例构造方法检查上面声明的静态实例是否为nil
-
1 +(SurveyRunTimeData*)sharedInstance{
} - 3,重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例
- 1 重写allocWithZone方法
- 4,适当实现allocWitheZone,copyWithZone,release和autorelease
- 1 适当实现allocWitheZone,copyWithZone,release和autorelease
下面我们按照上面的步骤来手写一个单例
static SurveyRunTimeData *sharedObj = nil; //第一步:静态实例,并初始化。
@implementation SurveyRunTimeData
+ (SurveyRunTimeData*) sharedInstance //第二步:实例构造检查静态实例是否为nil
{
@synchronized (self)//synchronized 线程锁死 同时只能有一个线程进行访问 注释1
{
if (sharedObj == nil)
{
[[self alloc] init];
}
}
return sharedObj;
}
+ (id) allocWithZone:(NSZone *)zone //第三步:重写allocWithZone方法
{
@synchronized (self) {
if (sharedObj == nil) {
sharedObj = [super allocWithZone:zone];
return sharedObj;
}
}
return nil;
}
- (id) copyWithZone:(NSZone *)zone //第四步
{
return self;
}
- (id) retain
{
return self;
}
- (unsigned) retainCount
{
return UINT_MAX;
}
- (oneway void) release
{
}
- (id) autorelease
{
return self;
}
- (id)init
{
@synchronized(self) {
[super init];//往往放一些要初始化的变量.
return self;
}
}
@end
代码注释:
注释1.synchronized(self)当两个并发线程访问同一个对象object中的这个synchronized(self)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
本文为Coder Bruce原创,转载需征得本人同意。