iOS精选

《Objective-C编程之道 iOS设计模式解析》笔记

2019-10-11  本文已影响0人  赫子丰

点击获取 《Objective-C编程之道 iOS设计模式解析》Source Code 源码
传送门:点击下载原书 PDF 版本

最近看完了《Objective-C编程之道 iOS设计模式解析》,确实很经典。
书中涉及 21 种设计模式,根据实际应用场景分了 8 个部分:
对象创建、接口适应、对象去耦合、抽象集合、行为扩展、算法封装、性能和对象访问、对象状态。
书中的示例多采用了 OMT 建模技术,所以先了解一下 OMT 基本规范很有必要,另外关于设计模式的基本原则也在此记录一下。

一、关于 OMT

OMT是Object Modeling Technique的缩写, 意为对象建模技术

OMT.png

二、设计模式的基本原则

设计模式的基本原则非常重要,只要真正深入地理解了设计原则,很多设计模式其实就是原则的应用而已,或许在不知不觉中就在使用设计模式了:

三、对象创建相关设计模式

1. Prototype 原型模式

一般在初始化信息不发生变化的情况下,克隆是最好的办法。这既可以隐藏对象创建的细节,又对性能是大大的提升。

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

适用情景:

2. 工厂方法模式

工厂方法也称为虚构造器。它适用于这种情况:一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。

定义:定义创建对对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到子类。

适用情形:

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

软件设计黄金法则:变动需要抽象。 比如,如果APP要支持更换皮肤,可以设计成抽象工厂。

抽象工厂与工厂方法比较

抽象工厂与工厂方法比较.png
说明:当现有的抽象工厂需要支持新的产品时,需要向父类添加相应的新工厂方法,这意味着也要修改其子类以支持新产品的新工厂方法。
4. 生成器模式
定义:  将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。

适用情景:

生成器与抽象工厂的比较

生成器与抽象工厂的比较.png
5. 单例模式
定义:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。

适用情形:

四、接口适应相关设计模式

1. 适配器模式

适配器模式,用于连接两种不同种类的对象,使其毫无问题地协同工作,有时它也称为包装起"wrapper"。 基本上有两种实现适配器的方式:

1.通过集成来适配来适配两个接口,这种称为类适配器,多通过多重继承来实现,但是OBJ-C没有多重继承,可以通过协议来实现。

2.对象适配器。与类适配器不同,对象适配器不继承被适配者,而是组合一个对它的引用。

定义:  将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用情形:

类适配器与对象适配器的对比

类适配器与对象适配器的对比.png
2. 桥接模式
定义:将抽象部分与它的实现部分分离,使它们都可以独立的变化。 

适用情形:

3. 外观模式
定义:为系统中的一组接口提供一个统一的接口,外观定义一个高层接口,让子系统更易于使用。 

适用情形:

五、对象去耦合相关设计模式

1. 中介者模式

”迪米特法则“,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发。

定义:用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。 

适用情形:

说明:中介者模式以中介者内部的复杂性代替交互的复杂性,因为中介者封装与合并了colleague的各种协作逻辑,
自身可能变得比他们任何一个都要复杂得多,这会让中介者本身变成无所不知的庞然大物,并且难以维护。
2. 观察者模式
定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。  也称作发布——订阅模式。 

适用情形:

通知与键值观察直接的主要差别

通知与键值观察直接的主要差别.png

六、抽象集合相关设计模式

1. 组合模式
定义:将对象组合成树形结构以表示“部分——整体”的层次结构,组合使得用户对单个对象和组合对象的使用具有一致性。 

适用情形:

2. 迭代器模式
定义:提供一种方法访问一个聚合对象中的各个元素,而又不暴露对该对象的内部表示。 

适用情形:

基本上由两种类型的迭代器:外部迭代器和内部迭代器。外部迭代器让客户端直接操作迭代过程,所以客户端需要知道外部迭代器才能使用。另一种情况是,集合对象在其内部维护并操作一个外部迭代器。提供内部迭代器的典型的集合对象为客户端定义一个接口,或者从底层的集合一次访问一个元素,或者向每个元素发送消息。

内部迭代器与外部迭代器的区别

内部迭代器与外部迭代器的区别.png

七、行为扩展相关设计模式

1. 访问者模式

访问者模式设计两个关键角色(或者说组件):访问者和它访问的元素。元素可以是任何对象,但通常是“部分-整体”结构中的节点。

定义:表示一个作用于某对象结构中的各元素的操作。它让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 

适用情形:

2. 装饰模式

标准的装饰模式包括一个抽象的 Component 父类它为其他具体组件(component)声明一些操作。

定义:动态地给一个对象添加一些额外地职责。就扩展功能来说,装饰模式相比生成子类更为灵活。

适用情形:

装饰模式与策略模式的差异

装饰模式与策略模式的差异.png

范畴 Category 与装饰模式

范畴 Category 与装饰模式.png
3. 责任链者模式

责任链模式的主要思想是,对象引用了同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的方法,处理链中第一个对象发起的同一个请求。如果一个对象不知道如何处理请求,它就把请求传给下一个响应器。

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

适用情形:

八、算法封装相关设计模式

1. 模板方法模式

该模式的基本思想是在抽象类的一个方法中定义“标准”算法。在这个方法中调用的基本操作应由子类重载予以实现。这个方法被称为“模板”,因为方法定义的算法缺少一些特有的操作。

定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以重定义算法的某些特定步骤而不改变算法的结构。

适用情形:

模板方法会调用5种类型的操作:

模板方法与委托模式的比较

模板方法与委托模式的比较.png
2. 策略模式
定义:定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法可独立于使用它的客户而变化。 

适用情形:

提示:如果代码中有很多条件语句,就可能意味着需要把它们重构成各种策略对象。
3. 命令模式
定义:将请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 

适用情形:

九、性能和对象访问相关设计模式

1. Flyweight pattern 享元模式

实现享元模式需要两个关机组件,通常是可共享的享元对象和保存它们的池。

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

适用场景:

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

适用情形:

十、对象状态相关设计模式

1. 备忘录模式
定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。 

适用情形:

参考链接1

参考链接2

上一篇 下一篇

猜你喜欢

热点阅读