跳转至

什么是设计模式

设计模式是软件设计中的最佳实践,解决通用问题

设计模式有三种主要类型:

  1. 结构设计模式: 用来搭建工程框架,可以组合成大型项目,例如: MVC、MVVM、Facade

  2. 行为设计模式: 描述对象间如何通信,例如:delegation、Strategy、Observer

  3. 创建设计模式: 描述怎样创建对象,例如:Builder、Singleton、Prototype

设计模式使用注意事项:

  1. 不要滥用设计模式,过度使用设计模式可能使问题变得更复杂,使用设计模式前要将问题定义清楚

  2. 部分设计模式已经在某些现在程序设计语言中内含了

  3. 设计模式是学习面向对象的懒人方式,如果知道某个设计模式可以解决的问题,就不需要重新通过面向对象的方式实现一次了

  4. 也有人说设计模式没什么卵用,不过既然它已经存在很久了,在开发过程中难免会碰到

设计模式的一些好处:

  1. 设计模式可以脱离具体的编程语言,对于开发者沟通有好处,有能用的描述方式

  2. 遵循设计模式的项目对于新接手的开发人员更加友好, 不需要费劲学习定制的程序逻辑

  3. 设计模式也可以用来装逼,让别人觉得你很牛逼

  4. 了解设计模式可以让你更好的理解遵循设计模式的程序代码

如何读懂设计模式中的类图

UML是标准的类图描述方式,但平常开发中也用不到所有关于UML中的东西,所以我们只学习一些常用的表示方法,足够描述大多数设计模式。

类图包含:类、协议、属性、方法、关系

一个方框表示一个类,中间可以写类名

一个向上的空心三角箭头表示继承自这种关系,指向父类,表示is a的关系:子类(下边) is a 父类(上边)

一个向右的正常箭头表示属性关联,指向关联的属性,表示has a的关系: 类 has a 属性, 如果在箭头边上写1...*, 则表示has one or many的关系: 类 has one or many 属性, 类名都是单数形式,关联是强引用

用一个方框表示协议,但方框内的协议名称需要用<<>>来包裹,这样就和类区分开了

使用向上的带用空心三角箭头的虚线表示对协议的实现/遵守关系:类(下边) implements or conforms to 协议

使用正常箭头虚线箭身表示依赖关系,具体什么样的依赖关系通常会在箭头边上注明,依赖是弱引用

类图里也可以写属性和方法

基础设计模式(iOS中用的比较多的)

MVC模式

三个角色: Model、View、Controller

关系: View和Model之间完全隔离,Controller起到中间人的作用,强持有并且可以操作View和Model,View和Model也可以分别通过target-Action和属性观察者模式来和Controller通信

为了避免循环引用,View和Model不能持有或者必须以弱引用的方式使用Controller,View以delegate的方式即是弱引用Controller的例子

代理模式

三个角色: 代理对象、代理协议、协议对象

代理对象依赖一个代理协议,协议对象实现了代理协议,可以作为代理对象的实际代理使用

这种模式一般用来折分大类或创建通用可复用组件

注意:不要给对象创建太多代理,如果一个对象的代理太多,说明这个对象需要拆分功能

策略模式

定义在运行时可以替换的一簇对象,由三部分组成: 使用协议的对象、策略协议本身、遵循策略协议的多个对象

与代理模式的区别在于,策略模式在运行时可以动态更换遵循协议的对象,代理模式一般协议对象在运行时不可变

单例模式

单例模式限制一个类只能有一个实例, UIApplication就是苹果实例的一个单例模式

单例加模式,除了提供一个公用实例外,也允许创建类其它实例,FileManager就是苹果的一个单例加模式的实现

单例模式要注意不要滥用,单例会例测试变的很困难,因为状态和使用顺序有关,mock数据很麻烦

纪念模式

纪念模式可以把一个对象存储/恢复,苹果的encoder和decoder就是这种模式

这个模式有三个角色: 要存储、恢复的对象 、 记事本、 串行化系统

这个模式可以用来实现撤销/重作功能, 这个功能在IDE中很常见

观察者模式

构建者模式