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

抽象集合

组合模式

定义

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

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

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

迭代器模式

定义

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

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

遍历树中节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

60.0/PhotoShop制作简单的网页效果

目录 60.1 网页的页面元素 60.1.1 网页的概念 60.2网站设计的步骤 60.2.1草案 ​编辑 60.2.2 丰富内容 60.2.3 利用切片划分功能区域 60.3.0 Gif动画的制作 60.1 网页的页面元素 60.1.1 网页的概念 是指通过浏览器能访问到的 Web 页面,是一种超文本文件&am…

SpringBoot3 核心原理

1. 事件和监听器 1. 生命周期监听 场景:监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…

同城配送小程序解决方案

前言 同城配送小程序解决方案。 一、用户用车 用户打开小程序后发货地址自动定位到用户当前位置,用户可通过地址后的>号在地图上选择新的发货地址和卸货地址,小程序会自动规划出行线路,计算距离和运费价格。 用户仅用简单操作后就可以…

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…

sql查找至少连续出现三次的数字

表&#xff1a;logss ---------------------- | column name | type | ---------------------- | id | int | | num | varchar | ----------------------id 是这个表的主键。 编写一个 sql 查询&#xff0c;查找所有至少连续出现三次的数字。 返回的…

C++ 文件操作篇

C 文件操作篇 文章目录 C 文件操作篇1 简介1.1 继承关系1.2 流1.3 缓冲区输入输出流中的缓冲streambuf 2 文件操作步骤2.1 头文件2.2 创建流对象2.3 打开文件2.4 读取数据第一种&#xff1a;**按元素直接读**第二种&#xff1a;**使用getline按行读**第三种&#xff1a;**使用*…

软文发稿:雅虎媒体套餐投放内容有哪些

在当今数字时代&#xff0c;软文发稿成为企业推广的重要手段之一。雅虎媒体套餐作为软文发稿的一个独特平台&#xff0c;吸引了众多企业的关注。本文将深入探讨雅虎媒体套餐投放的内容&#xff0c;以揭示其在软文推广中的独特价值。 雅虎作为全球著名的互联网公司之一&#xf…

ubuntu多用户环境dockerbug,卸载重装docker流程

之前不小心误操作删除重装docker&#xff0c;结果删除没成功&#xff0c;更没法重装&#xff0c;每次apt install都会报一个docker错误&#xff0c;虽然不影响软件的常规安装&#xff5e;但是现在还是需要装一个完整docker&#xff0c;还是选择删除一下&#xff0c;重点是关闭服…

❀My排序算法学习之选择排序❀

目录 选择排序(Selection Sort):) 一、定义 二、具体实现方法 三、算法性能 时间复杂度 稳定性 四、参考代码

探索中国制造API接口:解锁无限商机,引领制造业数字化转型

一、概述 中国制造API接口是一种应用程序接口&#xff0c;专门为中国制造行业提供数据和服务。通过使用API接口&#xff0c;开发者可以轻松地获取中国制造的商品信息、供应商数据、生产能力等&#xff0c;从而为他们的应用程序或网站提供更加丰富的内容和功能。 二、API接口的…

k8s---kubernets

目录 一、Kurbernetes 1.2、K8S的特性&#xff1a; 1.3、docker和K8S&#xff1a; 1.4、K8S的作用&#xff1a; 1.5、K8S的特性&#xff1a; 二、K8S集群架构与组件&#xff1a; 三、K8S的核心组件&#xff1a; 一、master组件&#xff1a; 1、kube-apiserver&#xff1…

【网络安全 | MD5截断比较】PHP、Python脚本利用

前言 在解题中&#xff0c;当遇到类似 substr(md5(a),-6,6) 7788这样的MD5截断比较的题目时&#xff0c;只有求出a的值才能进行接下来的操作。 一个一个去猜是不可能的&#xff0c;通常使用脚本解决&#xff0c;文末给出实战案例。 PHP循环脚本 <?phpfor($i1;$i<9…

51和32单片机读取FSR薄膜压力传感器压力变化

文章目录 简介线性电压转换模块51单片机读取DO接线方式51代码实验效果 32单片机读取AO接线方式32代码实验效果 总结 简介 FSR薄膜压力传感器是可以将压力变化转换为电阻变化的一种传感器&#xff0c;单片机可以读取然后作为粗略测量压力&#xff08;仅提供压力变化&#xff0c;…

清理 Oracle Arch 目录中的日志文件

清理Oracle Arch目录中的文件需要遵循以下步骤&#xff1a; 1、登陆Oracle数据库服务器&#xff1a;确保你有权限访问Oracle数据库服务器&#xff0c;并且能够登录到服务器操作系统。 ssh 192.168.1.200 su - oracle2、启动RMAN&#xff08;Recovery Manager&#xff09;&…

SpringBoot整合Spring-Security 认证篇(保姆级教程)

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135195636 代码仓库: https://gitee.com/skyblue0678/springboot-demo 为了跟shiro区别开&#xff0c;新建了一个分支&#xff1a; 目录 &#x1f339;1、友善问候一下 Spring …

短视频矩阵系统:赋予用户创造与分享的力量

在如今快节奏的社交网络时代&#xff0c;人们对于信息获取和娱乐方式的需求也逐渐发生了变化。作为当下最受欢迎的短视频平台之一&#xff0c;抖音短视频矩阵系统正以其独特的魅力和吸引力&#xff0c;深深地打动着亿万用户。 抖音短视频矩阵系统是一种基于移动端的短视频分享…

Hive的四种排序方法

Hive的四种排序方法 hive排序方法,hive的排序方式 hive有四种排序方法: ORDER BY 、SORT BY 、DISTRIBUTE BY 、CLUSTER BY 0. 测试数据准备 --数据准备 WITH t_emp_info AS ( SELECT * FROM (VALUES (1001, 研发部, 16000 ), (1002, 市场部, 17000 ), (1003, 销售部, 1100…

【Android 13】使用Android Studio调试系统应用之Settings移植(六):BannerMessagePreference

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、BannerMessagePreference的移植3.1 新的问题:找不到 R.dimen.settingslib_preferred_minimum_touch_target3.2 问题分析(一)3.2.1 资源定义的位置3.2.2 检查依赖3.2…

3D换肤在服装行业的应用

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 通过采用高质量的 3D 模型&#xff0c;企业可以提供更加身临其境的体…

解决阿里云远程连接yum无法安装问题(Ubuntu 22.04)

解决阿里云远程连接yum无法安装问题&#xff08;Ubuntu 22.04&#xff09; 第一步 进入阿里云远程连接后&#xff0c;尝试安装宝塔面包第二步&#xff1a;尝试更新软件包等一些列操作第三步&#xff1a;完成上述操作之后&#xff0c;尝试安装yum第四步&#xff1a;尝试更换清华…