Men的博客

欢迎光临!

0%

设计模式

代理模式

场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
优势:解耦合、多继承
实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。

观察者模式

场景:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
优势:解耦合
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,
注册观察者的对象可以接收。
kvo,键值对改变通知的观察者,平时基本没用过。

单例模式

场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
注意:
    单例类只能有一个实例。
    单例类必须自己创建自己的唯一实例。
    单例类必须给所有其他对象提供这一实例。
优势:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实
例,避免对资源的多重占用比如写文件操作
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻
辑,而不关心外面怎么样来实例化。
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
实例:UIApplication, NSBundle, NSNotificationCenter, 
NSFileManager, NSUserDefault, NSURLCache等都是单例.

工厂模式

场景:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式
“专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。”
优势:
    一个调用者想创建一个对象,只要知道其名称就可以了。
    扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
    每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统
    中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了
    系统具体类的依赖。这并不是什么好事。
实例:以 NSArray 举例,发现 + alloc 后并非生成了我们期望的类实例,而是一个__NSPlacehodlerArray 的中间对象,后面的 - init 或 - initWithXXXXX 消息都是发送给这个中间对象,再由它做工厂,生成真的对象。生成真的对象。这里的 __NSArrayI 和 __NSArrayM

MVC

是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。

MVVM

它其实是一个 MVC 的增强版,并将表示逻辑从 Controller 移出放到一个
新的对象里,即 View Model
在 iOS 上使用 MVVM 的动机,就是让它能减少 View Controller 的复杂
性并使得表示逻辑更易于测试

MVP

MVP全称Model-View-Presenter。
Presenter:作为model和view的中间人,从model层获取数据之后传给
view,使得View和model没有耦合。
View:这里的View与MVC中的V又有一些小差别,这个View可以是
viewcontroller、view等控件。Presenter通过向View传model数据进行交互。

MVVM双向绑定

mvvm框架的双向绑定,即当对象改变时,自动改变相关的dom元素的值,反之,当dom元素改变时,能自动更新对象的值,当然dom元素一般是指可输出的input元素。

1. 首先实现单向绑定,在指定对象的属性值发生改变时触发callback函数。
2. 单向绑定可采用ES5新增的defineProperty实现(或defineProperties),用了ES5注定就不支持IE9以下了,为了防止递归死循环问题,原有属性需要剪切到一个私有属性中保存。
3. 循环调用defineProperty定义闭包时产生作用域的问题,为解决作用域变量对象的值会取到最后一次运行值问题,多定义一层立即调用的闭包函数将值传入。
4. 我们定义getFN和setFN函数用于在属性get和set的时候触发,它的功能是对私有属性__private的读写并触发回调函数通知UI层更新界面。
5.单向绑定实现完成后,实现反向的绑定,即UI层onchange之后触发更新数据,这个相对比较容易,在dom中通过自定义属性bindKey关联model的值变化,监听使用oninput事件,相比onchange的好处是可以实时变化不用等失焦,而且对右键粘贴、菜单粘贴,拖动文字进文本框等方式都可以触发,完全无死角,缺点是只支持IE9以上,但是在IE9以下有等价的onpropertychange可以用还是能兼容的。
6.总结,双向绑定的原理并不复杂,整体代码不超过50行,非常精简,不过还是有一些技术含量,下面是完整的代码,如果不想使用庞大的框架,可以用一下。