读书笔记之设计模式

本文是关于《Objective-C编程之道:iOS设计模式解析》的读书笔记,介绍了包括原型、工厂方法、单例模式等13种设计模式,阐述了它们的定义、使用场景和CocoaTouch中的实例,帮助理解iOS开发中的设计思想。
摘要由CSDN通过智能技术生成

最近家里断网,正好静下心来看了一本书--《Objective-C编程之道:iOS设计模式解析》,现将笔记整理出来,以备日后查阅。

 

常用的设计模式如下:

---对象创建-----------------------------------------------------------

1、原型(Page48)

引入:采用活字印刷术,大量复制相同信息

定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。

使用场景

-->要实例化的类是在运行时决定的;

-->类的实例间的差异仅是状态的若干组合,复制相应数量的原型比手工实例化更加方便;

-->对象不容易创建。比如组合对象,复制已有的组合对象并对副本进行修改会更加容易;

本质:生成对象的真实副本(深复制,实现NSCopying协议与copyWithZone:方法)。

 

2、工厂方法(Page62)

引入:服装/手机工厂生产产品

定义:定义创建对象的接口,让子类决定实例化哪一个类。

使用场景

-->编译时无法准确预期要创建的对象的类,想让其子类在运行时决定创建什么;

-->类有若干辅助类为其子类,而你想将返回那个子类这一信息局部化;

本质:工厂方法使得一个类的实例化延迟到其子类。

CocoaTouch例子:NSNumber、NSNotification

 

3、抽象工厂(Page71)

引入:比萨饼的制作

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

CocoaTouch例子:NSNumber

 

二者对比


 

4、单例模式(Page92)

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

使用场景

-->类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问(如工厂方法);

-->这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码;

本质: 单例类总是返回自己的同一个实例。

CocoaTouch例子:UIApplication、NSFileManager

 

---接口适配-----------------------------------------------------------

5、外观(Page125)

引入:打出租车“送我去xxx”

定义:为系统中的一组接口提供一个统一的接口。

使用场景

-->子系统正逐渐变得复杂。应用模式的过程中演化出许多类,可以使用外观为这些子系统提供一个较简单的接口;

-->可以使用外观对子系统进行分层。每个子系统级别有一个外观作为入口点,让他们通过其外观进行通信,可以简化他们的依赖关系;

本质:外观定义一个高层接口,让子系统更易于使用。

 

---对象去耦----------------------------------------------------------

6、中介者(Page134)

引入:机场的空中交通管制

定义:用一个对象来封装一系列对象的交互方式。

使用场景

-->对象间的交互虽定义明确却非常复杂,导致一组对象彼此相互依赖而且难以理解;

-->因为对象引用了许多其他对象并与其通讯,导致对象难以复用;

-->想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类;

本质:中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

说明:中介者模式以中介者内部的复杂性代替交互的复杂性。

因为中介者封装与合并了同事的各种协作逻辑,自身可能变得比它们任何一个都复杂,这会让中介者本身成为庞然大物,并且难以维护,要注意避免这种情况。

 

7、观察者(Page148)

引入:飞行员关注自己航线的消息

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

使用场景

-->对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;

-->一个对象必须通知其他对象,而他又不需要知道其他对象是什么;

本质:中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

CocoaTouch例子:通知、KVO

 

---抽象集合--------------------------------------------------------

8、组合(Page164)

引入:家谱

定义:将对象组合成树形结构以表示“部分-整体”的层次结构。

使用场景

-->想获得对象抽象的树形表示(部分-整体层次结构);

-->想让客户端统一处理组合结构中的所有对象;

本质:组合使得用户对单个对象和组合对象的使用具有一致性。

CocoaTouch例子:UIView及其子视图

 

9、迭代器(Page177)

引入:自动售货机的分配器

定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。

使用场景

-->需要访问组合对象的内容,而又不暴露其内部表示;

-->需要通过多种方式遍历组合对象;

-->需要提供一个统一的接口,用来遍历各种类型的组合对象;

CocoaTouch例子:NSEnumerator、快速枚举  for(NSString *item inarray)

 

---行为扩展--------------------------------------------------------

10、责任链(Page219)

引入:智慧链条(这个问题我不懂,也许你懂)

定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

使用场景

-->有多个对象可以处理请求,而处理程序只有在运行时才能确定;

-->向一组对象发出请求,而不想显式指定处理请求的特定处理程序;

本质:将请求沿着链传递,直到有一个对象处理它为止。

 

11、命令(Page252)

引入:诸葛亮的锦囊妙计(到指定的时间或地点再打开、执行)

定义:将请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

使用场景

-->想让应用程序支持撤销与恢复;

-->想要在不同时刻对请求进行指定、排列、执行和记录日志;

CocoaTouch例子:NSInvocation、NSUndoManager、目标-动作机制

 

---性能与对象访问----------------------------------------------------

12、享元(Page272)

引入:乘坐公共汽车

定义:运用共享技术有效地支持大量细粒度的对象。

使用场景

-->应用程序使用很多对象,在内存中保存对象会影响内存性能;

-->对象的多数特有状态(外在状态)可以放到外部而轻量化;

-->应用程序不依赖于对象标识,因为共享对象不能提供唯一的标识;

本质:通过共享来节省内存

 

13、代理(Page282)

引入:商品免费试用

定义:为其他对象提供一种代理以控制对这个对象的访问。

使用场景

-->需要一个远程代理,为位于不同地址空间或网络中的对象提供本地代表;

-->需要一个虚拟代理,来根据要求创建重型的对象;

-->需要一个保护代理,来根据不同访问权限控制对原对象的访问;

本质:通常,代理是一种替代或者占位,它控制对另一些对象的访问。

实例:用虚拟代理懒加载图片、NSProxy

 

写在最后的话:使用设计模式更像是艺术行为而非科学行为!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值