🐻iOS设计模式

设计模式,一个一个学,等到理解后,揉碎,分散,而后修改现有项目,思考哪些能够用到哪一个设计模式。html

设计模式之路

  • 熟悉阶段,好像每一种设计模式都符合当前的状况,不一样的设计模式有歧义,有类似,有违背设计原则,彷佛都能解决。别怕,挑一个本身以为最合适的。
  • 使用阶段,会把各类设计模式混合使用,整的明明白白,但设计的会有些僵硬,缺乏灵活性
  • 融汇贯通,设计模式烂与心中,写代码时,天然而然久用到了本身模式,根据设计模式的七大原则,写出优秀的代码
  • 出神入化,设计原则已经出如今你的潜意识里,而且已经开始尝试新的原则设计。

就像张无忌跟张三丰学太极时,所有学会,才是入门;所有忘掉,才算是渐入佳境,距离成神还早着呢。ios

设计模式原则一览表

  • 开闭原则是总纲,它告诉咱们要对扩展开放,对修改关闭;
  • 里氏替换原则告诉咱们不要破坏继承体系;
  • 依赖倒置原则告诉咱们要面向接口编程;
  • 单一职责原则告诉咱们实现类要职责单一;
  • 接口隔离原则告诉咱们在设计接口的时候要精简单一;
  • 迪米特法则告诉咱们要下降耦合度;
  • 合成复用原则告诉咱们要优先使用组合或者聚合关系复用,少用继承关系复用。

一览表

名称 分类 思想 角色 示例
简单工厂模式 建立型 用个工厂来建立一个要求的相同种类东西 具体工厂类、抽象对象类、具体对象类 Factory生产 圆、方形、椭圆、菱形 的按钮
工厂方法模式 建立型 用个工厂来建立多个要求的相同种类东西 具体工厂类、抽象对象类、具体对象类 Factory生产 圆、方形、椭圆、菱形 的按钮,同时区分暗黑主题、仍是正常模式
抽象工厂模式 建立型 用个工厂来建立多个要求的不相同种类东西 抽象工厂、工厂、抽象产品多种、具体产品多种 Factory生产 圆、方形、椭圆、菱形 的控件,同时区分暗黑主题、仍是正常模式;控件包含按钮,UILabel、UIView、UIImageView
建造者模式 建立型 建立一个复杂的东西 指挥者、抽象建造者、具体建造者、被建造的对象 经过KFC点餐来学习建造者模式
单例模式 建立型 单1、重复使用、频繁使用 x XXManager,XXServer,UserDefault
= = = = =
适配器模式 结构型 把需适配者Adaptee,经过适配器Adapter,适配成能够供目标TargetA、B、C、D使用 ,注意ABCD用的都是Adaptee中的一样的功能,不是组合 Adaptee、Adapter、Target 经过撸一个滚动图来学习适配器模式
桥接模式 结构型 A想用B可是没办法经过继承组合等形式达成时 桥接文件,这里边应该是极其复杂的黑盒子 apple 提供了使用桥接的思想,一个是原生OC、Swift调用JS、另外一个是Swift调用OC;我能想到的一个示例:咱们用Swift本身去解析Lottie的json文件,而后修改里边的值,让其作动画、改变宽高、颜色
装饰器模式 结构型 动态的给对象增长方法 x swift中面向协议编程以及extension都是这种思想
外观模式 结构型 减小不一样类之间的交互,提供统一接口 使用者、 外观、子功能 在获取资源类中,须要分别调用本地缓存和网络数据,最后把这个组合结果返回;实现隔离减小不一样类之间的交互
代理模式 结构型 先占坑,异步操做 x 耗时操做,图片异步加载
享元模式 结构型 缓存系统,缓存在内存中、大量重复使用适合颗粒度较小的东西 x x
= = = = =
命令模式 (×) 行为型 把命令抽象成对象,具体的命令对象,给外界提供接口,同时负责命令的执行 抽象命令类、具体命令类、调用者、接收者 设计模式系列 6-- 命令模式
中介者模式 行为型 用一个中介对象来封装一系列的对象交互,中介者使各对象不须要显式地相互引用,从而使其耦合松散,并且能够独立地改变它们之间的交互 Mediator: 抽象中介者、ConcreteMediator: 具体中介者、Colleague: 抽象同事类、ConcreteColleague: 具体同事类 设计模式系列3--中介者模式
观察者模式 行为型 主动观察到状态改变,从而发生变化,一对多的场景 抽象目标 、目标、抽象观察者、观察者 KVO、Notification
状态模式 行为型 对象的行为取决于状态,环境类实际上就是拥有状态的对象,环境类有时候能够充当状态管理器(State Manager)的角色,能够在环境类中对状态进行切换操做 环境类、抽象状态类、具体状态类 设计模式系列9--状态模式
策略模式 行为型 定义一系列算法,把它们一个个的封装起来,而且使他们能够相互替换。策略模式使得算法可独立于使用它的客户端而变化 环境类、抽象策略类、具体策略类 X模块中有个分段函数,A、B、C须要X模块支持,可是对X模块中的分段函数有不一样要求,这时,你能够在X模块中写if、else语句、或者switch语句,但这样违反开闭原则,因此,更好的方式是把函数算法封装起来,做为参数传进去。

建立型模式

  • 建立型模式在建立什么(What),由谁建立(Who),什么时候建立(When)等方面都为软件设计者提供了尽量大的灵活性。算法

  • 建立型模式隐藏了类的实例的建立细节,经过隐藏对象如何被建立和组合在一块儿达到使整个系统独立的目的。编程

  • 说明:建立对象时,使用到的模式json

  • 关键字:build、构建、构造、建立、工厂模式swift

1、简单工厂模式

2、工厂设计模式

  • 场景:生产单一类型产品(大量,分给不一样工厂制造)
  • 角色:抽象工厂、工厂、抽象产品、具体产品
  • 参见工厂模式三兄弟

3、抽象工厂模式

  • 场景:生产多种类型产品(大量,分给不一样工厂制造)
  • 角色:抽象工厂、工厂、抽象产品多种、具体产品多种
  • 参见工厂模式三兄弟

4、建设者模式

5、单例模式

  • 场景:单1、重复使用、频繁使用
  • 注意:有些资源再也不须要时,或者收到内存警告时,主动释放
  • 示例:XXManager,XXServer,UserDefault

结构型模式

  • 说明:某一个功能比较复杂时,如何可复用\组合造成复杂的、功能更为强大的结构
  • 关键字:框架、解耦、隔离、组合、结构
  • 结构型模式能够分为类结构型模式和对象结构型模式
    • 类结构型模式关心类的组合,由多个类能够组合成一个更大的
    • 对象结构型模式关心类与对象的组合,经过关联关系使得在一 个类中定义另外一个类的实例对象,而后经过该对象调用其方法。 根据“合成复用原则”,在系统中尽可能使用关联关系来替代继 承关系,所以大部分结构型模式都是对象结构型模式。

1、适配器模式

2、桥接模式

  • A想用B可是没办法经过继承组合等形式达成时
  • 桥接文件,这里边应该是极其复杂的黑盒子
  • apple 提供了使用桥接的思想,一个是原生OC、Swift调用JS、另外一个是Swift调用OC;
  • 我能想到的一个示例:咱们用Swift本身去解析Lottie的json文件,而后修改里边的值,让其作动画、改变宽高、颜色

3、装饰器模式

  • 说明:动态的扩展方法、功能
  • 示例:swift中面向协议编程以及extension都是这种思想

4、外观模式

  • 说明:减小不一样类之间的交互,提供统一接口设计模式

  • 示例:好比获取资源类中,须要调用本地缓存、网络数据,实现隔离减小不一样类之间的交互缓存

  • 代码: https://www.raywenderlich.com/477-design-patterns-on-ios-using-swift-part-1-2#toc-anchor-007markdown

5、代理模式

  • 说明:先占坑,后操做
  • 示例:耗时操做,图片异步加载

6、享元模式

  • 说明:缓存系统,缓存在内存中、大量重复使用适合颗粒度较小的东西
  • 示例:未知

行为型模式

  • 说明:经过相互通讯与协做完成某些复杂功能,一个对象在运行时也将影响到其余对象的运行网络

  • 关键字:观察、通知、MVC、反馈、监控

  • 行为型模式分为类行为型模式和对象行为型模式两种:

    • 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要经过多态等方式来分配父类与子类的职责。
    • 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是经过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽可能使用关联关系来取代继承关系,所以大部分行为型设计模式都属于对象行为型设计模式。

1、命令模式

2、中介者模式

  • 说明:A、B之间不交流,经过C来完成沟通,
  • 示例:好比MVC中的 Model、View不直接交流,而是经过Controller交流;现实生活中的中介公司,干的就是这个活,Controller处理的事情太多,会变的愈来愈复杂,臃肿,这种模式的弊端也是如此。
  • 设计模式系列3--中介者模式

3、观察者模式

  • 说明:主动观察到状态改变,从而发生变化
  • 示例:KVO、Notification

4、状态模式

  • 说明:容许一个对象在其内部状态改变时改变它的行为。对象看起来彷佛修改了它的类。
  • 示例:设计模式系列9--状态模式
  • 我的理解:假如在不一样状态下,可能有一样的操做,这时把状态封装成类,把操做定义成协议,每一个状态类遵照这个协议,并实现。

5、策略模式

  • 说明:定义一系列算法,把它们一个个的封装起来,而且使他们能够相互替换。策略模式使得算法可独立于使用它的客户端而变化。
  • 示例1:设计模式系列8--策略模式
  • 示例2:X模块中有个分段函数,A、B、C须要X模块支持,可是对X模块中的分段函数有不一样要求,这时,你能够在X模块中写if、else语句、或者switch语句,但这样违反开闭原则,因此,更好的方式是把函数算法封装起来,做为参数传进去。

参考连接:

  • https://juejin.cn/post/6844903934230806535
  • https://design-patterns.readthedocs.io/zh_CN/latest/index.html
  • https://juejin.cn/user/3526889030556574

本文使用 mdnice 排版

相关文章
相关标签/搜索