Objectiv-C设计模式笔记
文章目录
- 通用知识点
- 对象创建
- 原型模式
- 定义
- 适用场景
- 示例
- 工厂方法
- 定义
- 适用场景
- 示例
- 抽象工厂
- 定义
- 适用场景
- 示例
- 生成器模式
- 定义
- 适用场景
- 示例
- 单例模式
- 定义
- 适用场景
- 示例
- 接口适配
- 适配器
- 定义
- 适用场景
- 示例
- 桥接
- 定义
- 适用场景
- 示例
- 外观模式
- 定义
- 适用场景
- 示例
- 对象去耦
- 中介者
- 定义
- 适用场景
- 示例
- 观察者
- 定义
- 适用场景
- 示例
- 抽象集合
- 组合模式
- 定义
- 适用场景
- 示例
- 迭代器模式
- 定义
- 适用场景
- 示例
通用知识点
- 软件设计的黄金法则: 变动需要抽象。
- 优先使用对象组合而不是继承。
对象创建
原型模式
定义
原型模式:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。
在iOS中原型模式本质是使用了对象的复制机制。遵守NSCopying协议,实现copywithzone方法实现对象的深复制。
适用场景
撤销重做等业务场景,常常和备忘录模式结合使用。
示例
有三个绘图时需要的模型对象,stroke
、vertex
和point
,其中stroke
可以是vertex
和point
的组合,vertex
是point
的超类。三者均遵守 Mark
协议。
为了实现原型模式,我们在Mark
接口中声明-(id)copy
方法,所有协议的实现类中实现-(id)copyWithZone:(NSZone *)zone;
方法即可完成原型模式。需要时直接调用上述三个类的copy
方法即可。
工厂方法
工厂方法要点在于不是直接创建对象,而是使用类或者对象的工厂方法创建具体产品(对象),并以抽象类返回。
定义
也称为虚构造器(virtual constructor)
工厂方法模式 : 定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
适用场景
一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。
示例
有画布类CanvasView
,我们增加需求,要求画布背景可由用户选择,目前有纸质背景PaperCanvasView
和布质背景ClothCanvasView
。
在CanvasViewconstroller
中返回默认无图案画布,在需要时调用方法加载有特殊图案的画布。
抽象工厂
定义
抽象工厂: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
适用场景
创建对象而不让客户端知晓返回了什么确切的具体对象。
示例
NSNumber
是个抽象工厂,而NSCFBoolean
与NSCFNumber
是工厂。注意有类族(Class Cluster)的使用。- 绘图程序中增加商标问题可使用抽象类工厂方法。
生成器模式
定义
生成器模式: 将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。
适用场景
- 需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。常见例子是构建组合对象。
- 构建过程需要以不同的方式(例如,部件或表现的不同组合)构建对象。
涉及具有各种特征的角色的游戏,应该好好使用这一模式,不是定义单独的Director去构建游戏者与敌人,而是把角色构建算法放在一个具体CharacterBuilder中,设计会好很多。
示例
游戏中有两种角色,跑步者和敌人,此时用生成器模式构建会更好。
单例模式
定义
单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用场景
- 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。
- 这个唯一的实例只能通过子类化经行扩展,而且扩展对象不会破坏客户端代码。
示例
UIApplication、NSFileManger等。
接口适配
适配器
定义
适配器模式: 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
有类适配器和对象适配器两种方式。
适用场景
- 已有类的接口与需求不匹配。
- 想要一个可复用的类,该类能够同可能带有不兼容接口的其他类协作。
- 需要适配一个类的几个不同子类,可是让每一个子类去子类化一个类适配器又不现实。那么可以使用对象适配器(也叫委托)来适配其父类的接口。
示例
颜色面板多滑动条调节功能,用命令模式和适配器模式结合使用。
桥接
定义
**桥接模式:**将抽象部分与它的实现部分分离,使它们都可以独立地变化。
适用场景
- 不想在抽象与实现之间形成固定的绑定关系(这样就能在运行时切换实现)
- 抽象及其实现都应可以通过子类化独立进行扩展。
- 对抽象的实现进行修改不应影响客户端代码。
- 如果每个实现需要额外的子类以细化抽象,则说明有必要把他们分成两个部分。
- 想在带有不同抽象接口的多个对象之间共享一个实现。
示例
虚拟仿真器。
外观模式
定义
外观模式: 为系统中的一组接口提供统一的接口。外观定义一个高层接口,让子系统更易使用。
适用场景
- 子系统正逐渐变得复杂
- 可以使用外观对子系统进行分层
示例
打车时不关心车品牌、车牌号和车辆驾驶,而自己开车有启动、挂挡和刹车等步骤。
对象去耦
中介者
定义
中介者模式: 用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用场景
- 对象之间的交互虽定义明确然而非常复杂,导致一组对象彼此相互依赖而难以理解。
- 因为对象引用了许多其他对象并与其通讯,导致对象难以复用。
- 想要定制一个分布在多个类中的逻辑或行为,又不想生成太多子类。
中介者模式以中介者内部的复杂性代替交互的复杂性。因为中介者封装与合并了colleague的各种协作逻辑,自身可能变得比它们任何一个都复杂。这会让中介者自身成为无所不知的庞然大物,并且难以维护。
示例
视图迁移。
观察者
定义
观察者模式: 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用场景
- 有两种抽象类型相互依赖。将它们封装在各自的对象中,就可以对它们单独进行改变和复用。
- 对一个对象改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
- 一个对象必须通知其他对象,而它又不需知道其他对象是什么。
示例
Cocoa中通知和KVO都是观察者模式的实现。
抽象集合
组合模式
定义
组合模式: 将对象组合成树形结构以表示”部分-整体“的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。
适用场景
- 想获得对象抽象的树形表示(部分-整体层次结构)
- 想让客户端统一处理组合结构中的所有对象。
示例
树形结构组织的每层用统一的接口,调用者不关心具体类型。
组合模式的主要意图是让树形结构中的每个节点具有相同的抽象接口。
迭代器模式
定义
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
适用场景
- 需要访问组合对象的内容,而又不暴露其内部表示
- 需要通过多种方式遍历组合对象
- 需要提供一个统一的接口,用来遍历各种类型的组合对象。
示例
遍历树中节点。
相关文章:
Objectiv-C设计模式笔记
文章目录 通用知识点对象创建原型模式定义适用场景示例 工厂方法定义适用场景示例 抽象工厂定义适用场景示例 生成器模式定义适用场景示例 单例模式定义适用场景示例 接口适配适配器定义适用场景示例 桥接定义适用场景示例 外观模式定义适用场景示例 对象去耦中介者定义适用场景…...

AI安全综述
1、引言 AI安全这个话题,通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生,包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性,有一系列的理论来论述对抗样本…...

计算机网络概述(下)——“计算机网络”
各位CSDN的uu们你们好呀,今天继续计算机网络概述的学习,下面,让我们一起进入计算机网络概述的世界吧!!! 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…...
anaconda创建环境时安装默认的第三方库
感谢阅读 写作原因首先要有python解释器加入每次创建环境都需要的python库查看所有的默认安装库还原方法 写作原因 近期由于多个项目在多头并举,出现了每次安装环境都要重新打一遍指令的麻烦问题,出于节约时间从而提高工作效率的目的。我尝试了很多方法…...

STM32 cubeMX 光敏电阻AD转化实验
文章代码使用 HAL 库。 文章目录 前言一、光敏电阻介绍二、光敏电阻原理图解析三、ADC采样介绍1. 工作原理:2. ADC精度: 四、STM32 cubeMX配置ADC采样五、代码编写总结 前言 实验开发板:STM32F051K8。所需软件:keil5 ,…...
AutoSAR(基础入门篇)3.2-Autosar中RTE的Ports【S/R】与【C/S】
目录 一、RTE的Ports【S/R】 1、特征 1.1、扮演SWCs和BSW的交流途径 1.2、其他特征...

安装kafka
静态文件安装(单机) 解压到指定目录(解压到 /usr) tar -zxf kafka_2.11-2.2.0.tgz -C /usr/ 到指定的解压目录下 cd /usr/kafka_2.11-2.2.0/ 配置主机名 查看是否配置了HOSTNAME vim /etc/sysconfig/network 没有就新增 HOSTNA…...

[MySQL] MySQL 高级(进阶) SQL 语句
一、高效查询方式 1.1 指定指字段进行查看 事先准备好两张表 select 字段1,字段2 from 表名; 1.2 对字段进行去重查看 SELECT DISTINCT "字段" FROM "表名"; 1.3 where条件查询 SELECT "字段" FROM 表名" WHERE "条件…...

创建springboot项目
SpringBoot 就相当于不需要配置文件的SpringSpringMVC。 常用的框架和第三方库都已经配置好了。 maven安装配置 管理项目依赖库的 maven的安装教程网上有很多,这里简单记录一下。 官网下载maven后并解压。 在其目录下添加一个目录repository 然后在conf目录下…...

“双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine
小 T 导读: 为了有效处理每日亿级的数据量,早在 2021 年,韵达就选择用 TDengine 替代了 MySQL,并在三台服务器上成功部署和上线了 TDengine 2.0 集群。如今,随着 TDengine 3.0 版本的逐渐成熟,韵达决定将现…...

STM32L432+LIS3DH【加速度传感器】:端侧AI
一、搜集芯片资料 1.LIS3DHTR:加速度传感器 查找链接: https://www.st.com/zh/mems-and-sensors/lis3dh.html 2. NUCLEO-L432KC:芯片 查找连接: https://www.st.com/zh/evaluation-tools/nucleo-l432kc.html#cad-resources 1.原理图 引…...
VCG Mesh刚性旋转(变换矩阵)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 旋转矩阵如果从线性空间的角度来看,它类似于一个投影过程。假设坐标 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1)...
R语言【base】——system.file() 在软件包等中查找文件的完整文件名。
Package base version 4.3.2 Parameters system.file(..., package "base", lib.loc NULL,mustWork FALSE) 参数【...】:字符向量,指定某个软件包中的子目录和文件。默认情况下,没有值则返回软件包的根目录。不支持通配符。 …...

HTML制作暴雨特效
🎀效果展示 🎀代码展示 <body> <!-- partial:index.partial.html --> <canvas id="canvas-club">...

cesium实现区域贴图及加载多个gif动图
1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图,如果能够将gif动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新Billboard的纹理,即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…...

blackbox黑盒监控部署(k8s内)tensuns专用
一、前言 部署在k8s中需要用到deployment、configmap、service服务 二、部署 创建存放yaml的目录 mkdir /opt/blackbox-exporter && cd /opt/blackbox-exporter 编辑blackbox配置文件,使用configmap挂在这 vi configmap.yaml apiVersion: v1 kind: Confi…...

“C语言“——scanf()、getchar() 、putchar()、之间的关系
scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换,并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串,它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…...

Spring Boot3 Web开发技术
前期回顾 springboot项目常见的配置文件类型有哪些?哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解? value restful风格 RESTful 风格与传统的 HTTP 请求方式相比,更加简洁,安全,能隐…...

学习笔记:数据挖掘与机器学习
文章目录 一、数据挖掘、机器学习、深度学习的区别(一)数据挖掘(二)机器学习(三)深度学习(四)总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…...

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动
效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...