iOS常用的几种设计模式


1. 委托代理模式

定义: 委托他人帮自己做某些事情.

应用时机: 当一个类的某些功能需要其他类实现但又不知道具体是哪个类时

好处: 解耦合

实例: UITableView的内置代理[cocoa中的代理模式,委托人: 框架中的对象(视图中的控件、表视图神马的), 代理人: 视图控制器对象]; 

         自定义的delegate

注意: 代理需要签署代理协议

自定义代理:

@protocol  AbcDelegate : NSObject

//方法

@end


//声明属性

@property (nonatomic, assign) id<AbcDelegate> delegate;


2. MVC模式

应用时机: 项目开发经常用到的设计模式,利用数据模型,控制器,视图将应用程序进行逻辑划分

好处: 使项目逻辑结构更加清晰,层次分明,易于维护与开发

实例: model--数据模型, controller--控制器, view--视图展示


3. 观察者模式

应用时机: controller与view需要进行通信,不需要关心接收者,只负责发送通知

好处: 解耦合

实例: KVO--键值观察,通过监听对象属性值的变化进行相应操作;

         UINotification--通知, 通过注册通知中心,在任何地方都可以发布消息, 程序运行时注册观察者的对象可以接收消息


4.单例模式

定义: 某个类在程序中有且只有一个实例对象,而且自行实例化并向整个程序提供这个实例.

应用时机: 程序全局都需要用到某个类,而且要保证全局使用的数据是一样的

好处:节约内存开销,能保证全局使用的数据相同, 一般工具类设置成单例; 

实例: [UIApplication  sharedApplication]

注意: 不加同步的懒汉式线程(每次获取实例都会判断,看是否需要创建实例)是不安全的,可能导致并发问题.

写一个简单的单例:

static  Share *obj = nil;

+ (id) shareInstance{

@synchronized (self) {

if (obj == nil){

obj =[ [Share alloc] init ];

}

}

return obj;

}

多线程实现单例:

+ (id) shareInstance{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

obj = [[Share alloc] init ];

});

return obj;

}




以下2种设计模式我基本没有用过,在网站查找了一些资料和blog,汇总一下

5. 简单工厂模式

定义:在基类中定义创建对象的接口,让子类决定实例化那个类;  工厂方法让一个类的实例化延迟到子类中进行

      (专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类)

应用时机: 一个类不知道它所创建的对象的类时;  一个类希望由它的子类决定所创建的对象时

                且类工厂负责创建的对象较少, 客户端只知道传入工厂类的参数,对于如创建对象的逻辑不必关心时;

好处: 客户端可以直接消费产品,而不比关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割;

不足:工厂类集中了所有产品的创建逻辑,一旦不能工作,整个程序都会收到影响, 且当产品类多结构复杂时,不利于后期程序的扩展.

注意: 1.要创建的类必须有同一个父类;

          2. 要创建的类在不同的地方调用的方法必须一致.


6.策略模式

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

应用时机: 将算法封装起来, 使他们可以相互转换.

好处: 算法和对象分开来, 使得算法可以独立于他的用户而变化.

不足: 客户必须知道所有的策略类才能决定选择哪一个,有时不得不向客服暴露所有的实现问题; 将会产生很多策略类.


有些我也总结的不是很深刻, 希望大家多提意见,一起学习



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值