建站套餐/2345浏览器网页版
文章目录
- 通用知识点
- 对象创建
- 原型模式
- 定义
- 适用场景
- 示例
- 工厂方法
- 定义
- 适用场景
- 示例
- 抽象工厂
- 定义
- 适用场景
- 示例
- 生成器模式
- 定义
- 适用场景
- 示例
- 单例模式
- 定义
- 适用场景
- 示例
- 接口适配
- 适配器
- 定义
- 适用场景
- 示例
- 桥接
- 定义
- 适用场景
- 示例
- 外观模式
- 定义
- 适用场景
- 示例
- 对象去耦
- 中介者
- 定义
- 适用场景
- 示例
- 观察者
- 定义
- 适用场景
- 示例
- 抽象集合
- 组合模式
- 定义
- 适用场景
- 示例
- 迭代器模式
- 定义
- 适用场景
- 示例
通用知识点
- 软件设计的黄金法则: 变动需要抽象。
- 优先使用对象组合而不是继承。
对象创建
原型模式
定义
原型模式:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。
在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的甘特图设置滚动时表头固定,让其他内容跟随滚动
效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…...

ElasticSearch 架构设计
介绍 ElasticSearchMySQLIndexTableDocumentRowFieldColumnMappingSchemaQuery DSLSQLaggregationsgroup by,avg,sumcardinality去重 distinctreindex数据迁移 ElasticSearch 中的一个索引由一个或多个分片组成 每个分片包含多个 segment(分…...

HTML---定位
目录 文章目录 一.定位属性概述 二.position 基础数值 三.z-index属性 网页元素透明度 练习 一.定位属性概述 HTML中的定位属性指的是用来控制HTML元素在页面中的位置和布局的属性,包括position、top、bottom、left和right等。 position属性指定了元素的定位方式&a…...

JVM高频面试题(2023最新版)
JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader(类加载器):根据给定的全限定名类名(java.lang.object)来装载class文件到Runtime data area(运行时数据区)…...

webpack学习-7.创建库
webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm,而且还要在项目中使用到它,支持各种…...

MQTT - 笔记
1 Mosquitto 官网 https://mosquitto.org/ 2 Windows环境下安装配置Mosquitto服务及入门操作介绍 Windows环境下安装配置Mosquitto服务及入门操作介绍-CSDN博客 3 开源:MQTT安装与配置使用 【C++】开源:MQTT安装与配置使用_c++ mqtt-CSDN博客 4 一文搞懂Qt-MQTT开发...

Django 安装
各位小伙伴想要博客相关资料的话,关注公众号:chuanyeTry即可领取相关资料! Django 安装 在安装 Django 前,系统需要已经安装了 Python 的开发环境。 如果你还没有安装 Python,请先从 Python 官网 https://www.python…...

推荐一个vscode看着比较舒服的主题:Dark High Contrast
主题名称:Dark High Contrast (意思就是,黑色的,高反差的) 步骤:设置→Themes→Color Theme→Dark High Contrast 效果如下: 感觉这个颜色的看起来比较舒服。...

YCSB 测试表预分区
最近使用 YCSB 测试时,一直使用如下方法创建预分区: TABLE_NAME"usertable" REGIN_SPLITS$((510-1)) cat << EOF | sudo -u hbase hbase shell create ${TABLE_NAME}, cf, {SPLITS > (1..${REGIN_SPLITS}).map {|i| "user#{100…...

K8s 教程
一文让你全面了解K8s(Kubernetes) - 知乎 Install and Set Up kubectl on Linux | Kubernetes阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 留存一份地址...

python:改进型鳟海鞘算法(SSALEO)求解23个基本函数
一、改进型鳟海鞘算法SSALEO 改进型鳟海鞘算法(SSALEO)由Mohammed Qaraad等人于2022年提出。 参考文献:M. Qaraad, S. Amjad, N. K. Hussein, S. Mirjalili, N. B. Halima and M. A. Elhosseini, "Comparing SSALEO as a Scalable Larg…...