小白程序员只能看懂源代码,而大神程序员能看懂文档。
设计模式:为解决特定场景的问题而定制的解决方案。
设计原则:构建可复制可维护代码的经验法则。
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
- 并发设计模式
- 框架级别的设计模式
-
设计模式的划分
- 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以前的代码,进行适当的改进。