Objectiv-C设计模式笔记

发布时间:2023年12月27日

通用知识点

  • 软件设计的黄金法则: 变动需要抽象。
  • 优先使用对象组合而不是继承。

对象创建

原型模式

定义

原型模式:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。

在iOS中原型模式本质是使用了对象的复制机制。遵守NSCopying协议,实现copywithzone方法实现对象的深复制。

适用场景

撤销重做等业务场景,常常和备忘录模式结合使用。

示例

有三个绘图时需要的模型对象,strokevertexpoint,其中stroke可以是vertexpoint的组合,vertexpoint的超类。三者均遵守 Mark协议。
为了实现原型模式,我们在Mark接口中声明-(id)copy方法,所有协议的实现类中实现-(id)copyWithZone:(NSZone *)zone;方法即可完成原型模式。需要时直接调用上述三个类的copy方法即可。

工厂方法

工厂方法要点在于不是直接创建对象,而是使用类或者对象的工厂方法创建具体产品(对象),并以抽象类返回。

定义

也称为虚构造器(virtual constructor)

工厂方法模式 : 定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

适用场景

一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。

示例

有画布类CanvasView,我们增加需求,要求画布背景可由用户选择,目前有纸质背景PaperCanvasView和布质背景ClothCanvasView
CanvasViewconstroller中返回默认无图案画布,在需要时调用方法加载有特殊图案的画布。

抽象工厂

定义

抽象工厂: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

适用场景

创建对象而不让客户端知晓返回了什么确切的具体对象。

示例
  • NSNumber是个抽象工厂,而NSCFBooleanNSCFNumber是工厂。注意有类族(Class Cluster)的使用。
  • 绘图程序中增加商标问题可使用抽象类工厂方法。

生成器模式

定义

生成器模式: 将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。

适用场景
  • 需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。常见例子是构建组合对象。
  • 构建过程需要以不同的方式(例如,部件或表现的不同组合)构建对象。

涉及具有各种特征的角色的游戏,应该好好使用这一模式,不是定义单独的Director去构建游戏者与敌人,而是把角色构建算法放在一个具体CharacterBuilder中,设计会好很多。

示例

游戏中有两种角色,跑步者和敌人,此时用生成器模式构建会更好。

单例模式

定义

单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

适用场景
  • 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。
  • 这个唯一的实例只能通过子类化经行扩展,而且扩展对象不会破坏客户端代码。
示例

UIApplication、NSFileManger等。

接口适配

适配器

定义

适配器模式: 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

有类适配器和对象适配器两种方式。

适用场景
  • 已有类的接口与需求不匹配。
  • 想要一个可复用的类,该类能够同可能带有不兼容接口的其他类协作。
  • 需要适配一个类的几个不同子类,可是让每一个子类去子类化一个类适配器又不现实。那么可以使用对象适配器(也叫委托)来适配其父类的接口。
示例

颜色面板多滑动条调节功能,用命令模式和适配器模式结合使用。

桥接

定义

**桥接模式:**将抽象部分与它的实现部分分离,使它们都可以独立地变化。

适用场景
  • 不想在抽象与实现之间形成固定的绑定关系(这样就能在运行时切换实现)
  • 抽象及其实现都应可以通过子类化独立进行扩展。
  • 对抽象的实现进行修改不应影响客户端代码。
  • 如果每个实现需要额外的子类以细化抽象,则说明有必要把他们分成两个部分。
  • 想在带有不同抽象接口的多个对象之间共享一个实现。
示例

虚拟仿真器。

外观模式

定义

外观模式: 为系统中的一组接口提供统一的接口。外观定义一个高层接口,让子系统更易使用。

适用场景
  • 子系统正逐渐变得复杂
  • 可以使用外观对子系统进行分层
示例

打车时不关心车品牌、车牌号和车辆驾驶,而自己开车有启动、挂挡和刹车等步骤。

对象去耦

中介者

定义

中介者模式: 用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

适用场景
  • 对象之间的交互虽定义明确然而非常复杂,导致一组对象彼此相互依赖而难以理解。
  • 因为对象引用了许多其他对象并与其通讯,导致对象难以复用。
  • 想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类。

中介者模式以中介者内部的复杂性代替交互的复杂性。因为中介者封装与合并了colleague的各种协作逻辑,自身可能变得比它们任何一个都复杂。这会让中介者自身成为无所不知的庞然大物,并且难以维护。

示例

视图迁移。

观察者

定义

观察者模式: 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

适用场景
  • 有两种抽象类型相互依赖。将它们封装在各自的对象中,就可以对它们单独进行改变和复用。
  • 对一个对象改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 一个对象必须通知其他对象,而它又不需知道其他对象是什么。
示例

Cocoa中通知和KVO都是观察者模式的实现。

抽象集合

组合模式

定义

组合模式: 将对象组合成树形结构以表示”部分-整体“的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。

适用场景
  • 想获得对象抽象的树形表示(部分-整体层次结构)
  • 想让客户端统一处理组合结构中的所有对象。
示例

树形结构组织的每层用统一的接口,调用者不关心具体类型。
组合模式的主要意图是让树形结构中的每个节点具有相同的抽象接口。

迭代器模式

定义

迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

适用场景
  • 需要访问组合对象的内容,而又不暴露其内部表示
  • 需要通过多种方式遍历组合对象
  • 需要提供一个统一的接口,用来遍历各种类型的组合对象。
示例

遍历树中节点。

文章来源:https://blog.csdn.net/zzl819954692/article/details/135232864
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。