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


    设计模式的类型.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)
      • 不改变原始类,不知道原始类具体实现,动态扩展功能
      • 不改变使用继承的情形,不想有更多子类不想通过继承的方式添加功能
      • 动态扩展对象的功能
      • 持有对象的引用,包含实例化的被装饰类
  • 装饰模式的优点
    不改变、不继承、动态扩展功能

  • 装饰模式的使用场景

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

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

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

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


工厂模式

  • 制造手机与使用手机

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

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

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

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

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


桥接模式

  • 遥控器与电视机

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

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

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

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


代理模式

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


单例模式

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


备忘录模式

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


生成器模式

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


命令模式

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


组合模式

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容