iOS 设计模式(GoF)

小白程序员只能看懂源代码,而大神程序员能看懂文档。

设计模式:为解决特定场景的问题而定制的解决方案。
设计原则:构建可复制可维护代码的经验法则。

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
    • 并发设计模式
    • 框架级别的设计模式
  • 设计模式的划分


    iOS 设计模式(GoF)_第1张图片
    设计模式的类型.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个链接

    • Software design pattern - Wikipedia
    • Design Patterns - Wikipedia
    • Gang Of Four

review以前的代码,进行适当的改进。


适配器模式

  • 何为适配器模式

    • 国家电压频率不一致问题
    • 充电器如何解决电压频率转换问题
    • 充电器于适配器之间的关联
  • 数据直接适配带来的困境

    • 直接赋值的灵活性问题
    • 如何降低数据层和视图层的耦合度

  • 使用适配器模式
    创建适配协议,创建抽象适配器类,创建类适配器/对象适配器。

    • 创建抽象适配器对象
    • 适配器与视图层建立输出的联系
    • 适配器与数据层建立输入的联系
    • 类适配器与对象适配器
  • 适配器模式的优缺点

    • 优点
      复用性更高,可移植性更强。
      • 降低视图层和数据层的耦合度
      • 通用性、好维护,不需要修改核心代码,只需要创建适配器类,或实现类适配器
    • 缺点
      • 实现操作多,可读性有局限性,必须深刻理解

review以前的代码,进行适当的改进。


策略模式

  • if -else的问题

    • 如果判断逻辑都使用if-else
    • 将if-else判断逻辑抽象为对象
    • 策略(整体)作为对象
  • 策略模式的原理

    • 策略模式的原理<静态关系>
      • 策略类
      • 策略接口
      • 具体策略类
      • 场景类
    • 相同的输入不同的输出
  • 策略模式的使用

    • 如何抽象出策略
    • 制定协议来维护输出信息
  • 策略模式的优缺点

    • 策略模式的优点
      • 简化if-else操作
      • 可维护很高,策略基类,实例化一个子类,按固定协议的抽象出的方案来判断
    • 策略模式的缺点
      • 验证号码是在实例化前就确定的策略,无法动态化

review以前的代码,进行适当的改进。


观察者模式

  • 如何订阅一本杂志

    • 如何订阅一本杂志
    • 订阅杂志过程角色功能的定义
    • 对功能模型进行抽象
  • 通知中心的抽象设计

    • 如何抽象接口
    • 对订阅对象抽象
    • 面向接口编程
  • 实现通知中心

    • 对象持有的问题
    • 用NSHashTable实现weak引用
    • 参数严格验证
  • KVO与通知中心

    • KVO与通知中心的使用
    • KVO与通知中心需要注意的细节

review以前的代码,进行适当的改进。


原型模式/外观模式

  • 模板的用处

    • 为何需要制作模板
      具有共通的特性,只需要修改元素,就可获取不同对象。
    • 何时需要制作模板
      对象之间十分相似,抽象部分完全相同,只有细节略有差异。
  • 原型模式的原理

    • 原型模式的基本原理
      对象支持拷贝自己
    • 何时使用原型模式
      复制自己,适用对象组合起来特别复杂,重新创建代价特别大时,用原型模式可以直接从模板拷贝出来通过修改几个值达到需求时。
  • NSCopying协议的使用细节

    • NSCopying协议的使用
    • 深拷贝与浅拷贝
    • 不支持NSCopying协议的对象
  • 如何去一个指定的地方

    • 自驾 or 坐火车
    • 用不同的手段达到相同的目的
  • 外观模式的原理

    • 外观模式的基本原理

    • 解耦合

    • 简化来操作

    • 何时使用外观模式

      • 复杂的子系统
      • 不关心逻辑,只要结果
    • 需要注意的细节

  • 如何绘制复杂的图形

    • 为何要简化操作逻辑
    • 用外观模式简化流程
    • 可维护性探讨

review以前的代码,进行适当的改进。


装饰模式

  • 照片与相框

    • 增加照片的美感
    • 相框的适用范围
    • 照片的复用性
  • 装饰模式的原理

    • 装饰模式的基本原理(UML)
      • 不改变原始类,不知道原始类具体实现,动态扩展功能
      • 不改变使用继承的情形,不想有更多子类不想通过继承的方式添加功能
      • 动态扩展对象的功能
      • 持有对象的引用,包含实例化的被装饰类
  • 装饰模式的优点
    不改变、不继承、动态扩展功能

  • 装饰模式的使用场景

    • 静态库需要扩展功能,却无法修改实现
  • 实现装饰模式

    • 如何增加新的按钮
    • 装饰模式的实现
  • category 的使用

    • category 与装饰模式的细微区别
    • 给 category 添加属性,重写被装饰对象方法
    • 使用 category 需要注意的一些地方

review以前的代码,进行适当的改进。


工厂模式

  • 制造手机与使用手机

    • 制造手机的过程
    • 使用手机的行为
    • 何为工厂方法
  • 简单工厂

    • 简单工厂原理
    • 为何叫简单工厂
    • 简单工厂使用场景
      • 简化生产流程
      • 隔离生产产品的细节
      • 不同类型的产品之间有着一些共同的细节
      • 具体工厂
  • 抽象工厂

    • 抽象工厂原理
    • 抽象工厂抽象在哪里
    • 抽象工厂使用场景
  • Cocoa 框架中的 NSNumber

    • NSNumber 的抽象行为
    • NSNumber 与工厂方法的比较

review以前的代码,进行适当的改进。


桥接模式

  • 遥控器与电视机

    • 遥控器遥控电视机的过程
    • 遥控器与电视机职能的分解
    • 建立抽象层次结构
  • 桥接模式原理
    桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更。抽象层次定义了供客户端使用的上层抽象接口。实现结构定义了供抽象层使用的底层接口。实现类的引用被封装到抽象层的实例中,桥接就形成了。

    • 上层抽象接口的职能
    • 实现层抽象接口的职能
    • 层级间的通信协议
    • 桥接模式的原理
  • 设计游戏机模拟器

    • 游戏机模拟器的功能定义
    • 按钮协议的制定
    • 游戏机模拟器的实现

review以前的代码,进行适当的改进。


代理模式

review以前的代码,进行适当的改进。


单例模式

review以前的代码,进行适当的改进。


备忘录模式

review以前的代码,进行适当的改进。


生成器模式

review以前的代码,进行适当的改进。


命令模式

review以前的代码,进行适当的改进。


组合模式

review以前的代码,进行适当的改进。

你可能感兴趣的:(iOS 设计模式(GoF))