小白程序员只能看懂源代码,而大神程序员能看懂文档。
设计模式:为解决特定场景的问题而定制的解决方案。
设计原则:构建可复制可维护代码的经验法则。
MVC是复合设计模式(不是基本设计模式,属于架构级的设计模式)。
- Model上的Notification和KVO是观察者模式。
 - Controller和View之间的target-action是命令模式。
 - delegate是代理模式其实是适配器模式。
 - View将接收到动作给Controller,Controller使Model做不同的操作,取决于控制器的内置策略,是策略模式。
 - 控制器构成了Model和View之间传递数据的双向通道,是中介者模式。
 
- 适配器模式
 
- 策略模式
 - 观察者模式
 - 原型模式/外观模式
 - 装饰模式
 - 工厂模式
 - 桥接模式
 - 代理模式
 - 单例模式
 - 备忘录模式
 - 生成器模式
 - 命令模式
 - 组合模式
 
编码是门艺术
设计30层楼栋项目,设计一开始就有完善的设计稿,材料,论证抗震指数。
设计模式就像是设计高楼的设计稿,是用以解决实际问题的。
设计模式是抽象出来的理论,但用来解决的实际问题,一点也不抽象。
设计模式是为复杂的项目而设计的,大部分用于非常复杂的项目,简化项目设计,让设计与实现成为可能。
为何会抽象出设计模式
几十人做的项目,就要按图纸,按固定、有效率的方式实现细节。
设计模式是之前开发人员在开发大型项目遇到的问题,抽象出来的解决方案,是为解决特定问题而存在的。设计模式可以解决什么问题
遇到复杂项目,用以解决特定存在的问题。
适配器模式,专门用来解决接口适配问题,model与view绑定的设计不好,model修改继而修改view,而适配器模式是model与view产生隔离,分别只会与适配器接触,达到解耦的效果。- 
学习设计模式的必要性
- 务必先理解透彻
- 面向对象语言的3种特性,封装、继承、多态
 - 设计模式基本原则,开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则,合成/聚合复用
 
 
 - 务必先理解透彻
 - 
推荐两本书
- 《Pro Design Patterns in Swift》
 - 《Pro Objective-C Design Patterns for iOS》
 
 
现实开发中遇到的特定问题,才用设计模式来优化这种设计。
设计模式基本原则
- 开闭原则
模块开发,对扩展开放,对修改关闭。 - 里氏代换原则
子类父类相互替换,类似抽象父类调用子类方法 - 依赖倒转原则
抽象不依赖细节,细节依赖抽象,用于设计接口,不破坏封装性,类似抽象方法不暴露实现细节,实现细节方法依赖抽象方法 - 
接口隔离原则
接口做必要的事情,不做没有相关性的事,如果开发严格遵守接口隔离原则,会让源码复用性很高。 - 合成/聚合复用
 
设计模式的类型
- 
设计模式的类型
- GoF
 - 并发设计模式
 - 框架级别的设计模式
 
 - 
设计模式的划分
设计模式的类型.png 
- GoF patterns(23种GoF设计模式)
 
(Creational)
- Abstract factory(抽象工厂模式)
 - Builder(生成器模式)
 - ** Factory method(工厂模式)**
 - Prototype(原型模式)
 - 
Singleton(单例模式)
(Structural ) - Adapter(适配器模式)
 - Bridge(桥接模式)
 - Composite(组合模式)
 - Decorator(装饰模式)
 - Facade(外观模式)
 - Flyweight(享元模式)
 - 
Proxy(代理模式)
(Behavioral) - Chain of responsibility(责任链模式)
 - Interpreter(解析器模式)
 - Iterator(迭代器模式)
 - Mediator(中介者模式)
 - Memento(备忘录模式)
 - Observer(观察者模)
 - State(状态模式)
 - Strategy(策略模式)
 - Template method(模板方法模式)
 - Visitor(访问者模式)
 
- Concurrency patterns(并发模型)
 
- Active object(主动对象模式)
 - Balking(止步模式)
 - Double-checked locking(双重检查锁定)
 - Event-based asynchronous(基于事件的异步锁模式)
 - Guarded suspension(保护暂停模式)
 - Join(加盟模式)
 - Lock(加锁模式)
 - Monitor(监视器)
 - Proactor(Proactor模式)
 - Reactor(Reactor模式)
 - Read write lock(读写锁)
 - Scheduler(调度)
 - Thread pool(线程池模式)
 - Thread-local storage(线程本地存储TLS)
 
- Architectural patterns
 
- Front controller(前端控制器模式)
 - intercepter(拦截器模式)
 - MVC(模型-视图-控制器模式,MVC模式)
 - n-tier(多层架构模式)
 - Specification(规格模式)
 - Publish-subscribe(订阅发布模式)
 - Naked objects(Naked objects模式)
 - Service locator(服务定位器模式)
 - Active record(活跃记录模式)
 - Identity map(恒等映射模式)
 - Data access object(数据访问对象模式,DAO模式)
 - Data transfer object(数据传输对象模式,DTO模式)
 
- Other patterns
 
Dependency injection(依赖性注射模式)
lazy loading(懒加载模式)
Mock object(模拟对象)
Null object(空对象模式)
Object pool(对象池模式)
Servant(仆人模式)
Type tunnel(隧道模式)
功能划分
对象创建
接口适配,设计模式
对象去耦,观察者
抽象集合,组合模式
行为扩展,访问者
算法封装,策略模式
对象访问,代理模式
对象状态,备忘录,用于回退操作,并保存每一步修改状态
- 
推荐3个链接
 
review以前的代码,进行适当的改进。
适配器模式
- 
何为适配器模式
- 国家电压频率不一致问题
 - 充电器如何解决电压频率转换问题
 - 充电器于适配器之间的关联
 
 - 
数据直接适配带来的困境
- 直接赋值的灵活性问题
 - 如何降低数据层和视图层的耦合度
 
 
- 
使用适配器模式
创建适配协议,创建抽象适配器类,创建类适配器/对象适配器。- 创建抽象适配器对象
 - 适配器与视图层建立输出的联系
 - 适配器与数据层建立输入的联系
 - 类适配器与对象适配器
 
 - 
适配器模式的优缺点
- 优点
复用性更高,可移植性更强。- 降低视图层和数据层的耦合度
 - 通用性、好维护,不需要修改核心代码,只需要创建适配器类,或实现类适配器
 
 - 缺点
- 实现操作多,可读性有局限性,必须深刻理解
 
 
 - 优点
 
review以前的代码,进行适当的改进。
策略模式
- 
if -else的问题
- 如果判断逻辑都使用if-else
 - 将if-else判断逻辑抽象为对象
 - 策略(整体)作为对象
 
 - 
策略模式的原理
- 策略模式的原理<静态关系>
- 策略类
 - 策略接口
 - 具体策略类
 - 场景类
 
 - 相同的输入不同的输出
 
 - 策略模式的原理<静态关系>
 - 
策略模式的使用
- 如何抽象出策略
 - 制定协议来维护输出信息
 
 - 
策略模式的优缺点
- 策略模式的优点
- 简化if-else操作
 - 可维护很高,策略基类,实例化一个子类,按固定协议的抽象出的方案来判断
 
 - 策略模式的缺点
- 验证号码是在实例化前就确定的策略,无法动态化
 
 
 - 策略模式的优点
 
review以前的代码,进行适当的改进。
观察者模式
- 
如何订阅一本杂志
- 如何订阅一本杂志
 - 订阅杂志过程角色功能的定义
 - 对功能模型进行抽象
 
 - 
通知中心的抽象设计
- 如何抽象接口
 - 对订阅对象抽象
 - 面向接口编程
 
 - 
实现通知中心
- 对象持有的问题
 - 用NSHashTable实现weak引用
 - 参数严格验证
 
 - 
KVO与通知中心
- KVO与通知中心的使用
 - KVO与通知中心需要注意的细节
 
 
review以前的代码,进行适当的改进。
原型模式/外观模式
- 
模板的用处
- 为何需要制作模板
具有共通的特性,只需要修改元素,就可获取不同对象。 - 何时需要制作模板
对象之间十分相似,抽象部分完全相同,只有细节略有差异。 
 - 为何需要制作模板
 - 
原型模式的原理
- 原型模式的基本原理
对象支持拷贝自己 - 何时使用原型模式
复制自己,适用对象组合起来特别复杂,重新创建代价特别大时,用原型模式可以直接从模板拷贝出来通过修改几个值达到需求时。 
 - 原型模式的基本原理
 - 
NSCopying协议的使用细节
- NSCopying协议的使用
 - 深拷贝与浅拷贝
 - 不支持NSCopying协议的对象
 
 - 
如何去一个指定的地方
- 自驾 or 坐火车
 - 用不同的手段达到相同的目的
 
 - 
外观模式的原理
外观模式的基本原理
解耦合
简化来操作
- 
何时使用外观模式
- 复杂的子系统
 - 不关心逻辑,只要结果
 
 需要注意的细节
 - 
如何绘制复杂的图形
- 为何要简化操作逻辑
 - 用外观模式简化流程
 - 可维护性探讨
 
 
review以前的代码,进行适当的改进。
装饰模式
- 
照片与相框
- 增加照片的美感
 - 相框的适用范围
 - 照片的复用性
 
 - 
装饰模式的原理
- 装饰模式的基本原理(UML)
- 不改变原始类,不知道原始类具体实现,动态扩展功能
 - 不改变使用继承的情形,不想有更多子类不想通过继承的方式添加功能
 - 动态扩展对象的功能
 - 持有对象的引用,包含实例化的被装饰类
 
 
 - 装饰模式的基本原理(UML)
 装饰模式的优点
不改变、不继承、动态扩展功能- 
装饰模式的使用场景
- 静态库需要扩展功能,却无法修改实现
 
 - 
实现装饰模式
- 如何增加新的按钮
 - 装饰模式的实现
 
 - 
category 的使用
- category 与装饰模式的细微区别
 - 给 category 添加属性,重写被装饰对象方法
 - 使用 category 需要注意的一些地方
 
 
review以前的代码,进行适当的改进。
工厂模式
- 
制造手机与使用手机
- 制造手机的过程
 - 使用手机的行为
 - 何为工厂方法
 
 - 
简单工厂
- 简单工厂原理
 - 为何叫简单工厂
 - 简单工厂使用场景
- 简化生产流程
 - 隔离生产产品的细节
 - 不同类型的产品之间有着一些共同的细节
 - 具体工厂
 
 
 - 
抽象工厂
- 抽象工厂原理
 - 抽象工厂抽象在哪里
 - 抽象工厂使用场景
 
 - 
Cocoa 框架中的 NSNumber
- NSNumber 的抽象行为
 - NSNumber 与工厂方法的比较
 
 
review以前的代码,进行适当的改进。
桥接模式
- 
遥控器与电视机
- 遥控器遥控电视机的过程
 - 遥控器与电视机职能的分解
 - 建立抽象层次结构
 
 - 
桥接模式原理
桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现结构定义了供抽象层使用的底层接口。实现类的引用被封装到抽象层的实例中,桥接就形成了。- 上层抽象接口的职能
 - 实现层抽象接口的职能
 - 层级间的通信协议
 - 桥接模式的原理
 
 - 
设计游戏机模拟器
- 游戏机模拟器的功能定义
 - 按钮协议的制定
 - 游戏机模拟器的实现
 
 
review以前的代码,进行适当的改进。
代理模式
review以前的代码,进行适当的改进。
单例模式
review以前的代码,进行适当的改进。
备忘录模式
review以前的代码,进行适当的改进。
生成器模式
review以前的代码,进行适当的改进。
命令模式
review以前的代码,进行适当的改进。
组合模式
review以前的代码,进行适当的改进。
