当前位置: 首页 > news >正文

Objectiv-C设计模式笔记

文章目录

    • 通用知识点
    • 对象创建
      • 原型模式
        • 定义
        • 适用场景
        • 示例
      • 工厂方法
        • 定义
        • 适用场景
        • 示例
      • 抽象工厂
        • 定义
        • 适用场景
        • 示例
      • 生成器模式
        • 定义
        • 适用场景
        • 示例
      • 单例模式
        • 定义
        • 适用场景
        • 示例
    • 接口适配
      • 适配器
        • 定义
        • 适用场景
        • 示例
      • 桥接
        • 定义
        • 适用场景
        • 示例
      • 外观模式
        • 定义
        • 适用场景
        • 示例
    • 对象去耦
      • 中介者
        • 定义
        • 适用场景
        • 示例
      • 观察者
        • 定义
        • 适用场景
        • 示例
    • 抽象集合
      • 组合模式
        • 定义
        • 适用场景
        • 示例
      • 迭代器模式
        • 定义
        • 适用场景
        • 示例

通用知识点

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

对象创建

原型模式

定义

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

在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都是观察者模式的实现。

抽象集合

组合模式

定义

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

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

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

迭代器模式

定义

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

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

遍历树中节点。

相关文章:

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支持单帧纹理贴图&#xff0c;如果能够将gif动图进行解析&#xff0c;获得时间序列对应的每帧图片&#xff0c;然后按照时间序列动态更新Billboard的纹理&#xff0c;即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…...

blackbox黑盒监控部署(k8s内)tensuns专用

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

“C语言“——scanf()、getchar() 、putchar()、之间的关系

scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换&#xff0c;并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串&#xff0c;它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…...

Spring Boot3 Web开发技术

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

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…...

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

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

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐&#xff08;alignment&#xff09;中&#xff0c;强化学习&#xff08;RL&#xff09;是一种重要的策略。而其中两种典型形式——RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff09; 与 RLVR&#xff08;Reinforcement Learning with Ver…...

java+webstock

maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...