iOS-设计模式

一、观察者模式

      故名思意就是有一个对象在默默的看着目标对象,看它是否变化,如果变换就把变化通知给关心这个变化的对象。在iOS开发中,我们主要有两种方式来实现观察者模式:notification 和KVO;

    1、通知:notification。notification实现的是一对多的信息传递,可以有多个对象收听同一个广播,收听广播的对象负责回收你的广播订阅。

//订阅广播

NSNotificationCenter  * notificationCenter1 = [NSNotificationCenter  defaultCenter];    [notificationCenter addObserver:self  selector:@selector(update:) name:@"subjectMessage"  object:nil ];

//发生变化发出通知

[notificationCenter postNotification:subjectMessage];

//回收订阅

[[NSNotificationCenter defaultCenter] removeObserver:self];

  2、KVO,成为键值观察的机制,对象可以通过它得到其他对象特定属性的变更通知,NSKeyValueObserving协议是基础。它和通知的区别在于,KVO是被观察者直接向观察者发出通知,主要用来绑定特定对象的属性。

[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

//变化后的通知内容

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{if([keyPath isEqualToString:@"name"])    {NSLog(@"赋值后--%@",self.hero.name);NSLog(@"新的值--%@",change[@"new"]);NSLog(@"以前的值--%@",change[@"old"]);

}

}

[self.hero removeObserver:self forKeyPath:@"name"];//注销观察者。

二、delegate模式

       简单来说代理模式,就是把想实现的行为和对象分离开,对象把这些行为委托给其他有能力的对象,来实现自己的功能。前提是,对象要把这些希望其他对象实现的方法,用@protocal的形式声明出来。所有接受委托的的对象,也要明确的接受这个协议才可以。最常见的就是tableView的delegate和dataSource。这个太多,掠过细节。

三、MVC模式

       根据功能把app中的类分为Model、View、Controller三个角色,这是iOS开发的经典模式;

模型会把任何数据的变更通知控制器,然后控制器更新视图数据。视图对象通知控制器用户的操作,控制器要么根据需要来更新模型,要么检索任何被请求的数据。

你可能在想为什么不能仅仅使用控制器,在一个类中实现视图和模型,这样貌似更加容易?

所有的这些都归结于代码关注点分离以及复用。在理想的状态下,视图应该和模型完全的分离。如果视图不依赖某个实际的模型,那么视图就可以被复用来展示不同模型的数据。

四、MVVM模式

五、单利模式

        单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有一个全局唯一的访问点。它通常采用懒加载的方式在第一次用到实例的时候再去创建它。

        例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],这是Apple系统给我提供的单例。我们也可以自己创建单例,比如视频播放器、比如账号对象、等等。

       单例的要点:1、该类有且只有一个实例;2、该类必须能够自行创建实例;3、该类可以向整个系统提供这个实例。

       单例的优点:提供了唯一对象,在内存中只有一个对象节约资源,提高性能。更灵活的实例化过程。

       单例的缺点:单例没有抽象层,扩展很困难。单例职责过重,违背了单一职责原则。

单例的实现如下:

@implementation  Singleton

static Singleton * sharedSingleton =nil;

+ (Singleton *) sharedInstance

{if(sharedSingleton ==nil) {

sharedSingleton=[[Singleton alloc] init];

}

return sharedSingleton;

}

@end

另外有一个GCD的单例方式:

static Myclass _instance;

方法一:

+(id)shareInstance{

@synchronized(self){

if(_instance == nil)

_instance = [MyClass alloc] init];

}

return _instance;

}

方法二:

+(id)shareInstance{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if(_instance == nil)

_instance = [MyClass alloc] init];

});

return _instance;

}

//重写allocWithZone,里面实现跟方法一,方法二一致就行.

+(id)allocWithZone:(struct _NSZone *)zone{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

if(_instance == nil)

_instance = [MyClass alloc] init];

});

return _instance;

} 这个函数重写,否则是错误的。请读者注意。

//保证copy时相同

-(id)copyWithZone:(NSZone *)zone{

return _instance;

}

单例需要注意的是在ARC和MRC下写法有所不同

MRC下创建单例步骤一样,不过要处理一些内存管理的函数

-(id)retain{//计数器不用加1

return self ;

}

-(id)autorelease{//不需要,堆区对象才需要

return self;

}

-(oneway void)release{};

-(NSUInteger)retainCount{return UINT_MAX;}

单例的销毁:

在mrc下

+(void)attemptDealloc{

[_instance release]; //mrc 需要释放,当然你就不能重写release的方法了.

_instance = nil;

}

必须把static dispatch_once_t onceToken; 这个拿到函数体外,成为全局的

+(void)attempDealloc{

onceToken = 0; // 只有置成0,GCD才会认为它从未执行过.它默认为0.这样才能保证下次再次调用shareInstance的时候,再次创建对象.

[_instance release];

_instance = nil;

}

六、策略模式 Policy

       一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

        我们在验证用户输入的表单的时候,加入包括电话输入框的验证和邮件输入框的验证,这两部分的验证算法是不同的,如果把这个算法看成一个函数,他几乎有相同的输入参数和返回参数。我们可以把这个相同的函数可以抽象为基类(InputValidator)的一个方法(bool validateInput(input,error)),然后抽象出两个具体的策略类:电话验证类(PhoneValidator)和邮件验证类(EmailValidator),他们需要在各自的实现里面去复写父类的验证方法。为了能够正常的调用到验证类的验证方法,我们需要自定义一个UITextField的子类CustomTextField,其中有一个InputValidator类型的引用和一个validate方法,该方法里面调用InputValidator的验证方法,然后在textFieldDidEndEditing代理方法里面调用CustomTextField的validate方法,这样就不用我们在判断输入是否合法的时候通过if else去处理每种逻辑,而且这样做方便扩展,提高可复用性

七、工厂模式

就是类方法,创建对象更方便一些。

八、MVVM

        随着现在App的功能的增加导致复杂程度的提高,我们在View Controller放的东西越来越多,许多逻辑被放在 View Controller 里。它们中的一些确实属于 View Controller,但更多的是所谓的“表示逻辑(presentation logic)”,就是那些将 Model 数据转换为 View 可以呈现的东西的事情。

      MVVM的引进,不是用ViewModel来取代View Controller,而是把“表示逻辑”从View Controller中抽出来放到ViewModel中,来缓解View Controller的压力,MVVM 听起来很复杂,但它本质上就是一个精心优化的 MVC 架构,而 MVC 你早已熟悉。

      在 iOS 上使用 MVVM 的动机,对我来说,无论如何,就是它能减少 View Controller 的复杂性并使得表示逻辑更易于测试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 2015/04/22更新:最新更新到Xcode6.3和Swfit 1.2。 更新日志:这个教程由Vicent Ng...
    木易林1阅读 283评论 0 0
  • 单例 单例使用懒加载方式在第一次实例时创建,如[NSUserDefaults standardUserDefaul...
    狮子_挽歌_阅读 296评论 0 1
  • 亲爱的儿子好几天没给我打电话了,看样子你是习惯了那里的生活,高兴了习惯了就把老妈忘了。昨晚你打电话来给妈妈...
    五度练字玲阅读 152评论 0 2
  • By:本人是作者 一:产品内容-专门教你在职场里作死的(顶撞上司殴打面试官那都是常态) 二:产品方案:通过微信对话...
    边走边停的阿Q阅读 758评论 0 2
  • 站在讲台上上课的老师问我们:“同学们知道什么叫白马过隙吗?” 像马儿飞快地跑过山间的缝隙,形容时间过得很快! 白马...
    是蓂荚呀阅读 232评论 0 0