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的甘特图设置滚动时表头固定,让其他内容跟随滚动
效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
