Objective-C之通过协议提供匿名对象

概述
通过协议提供匿名对象的设计模式,遵循了面向对象设计的多项重要原则:
- 接口隔离原则:通过定义细粒度的协议来避免实现庞大的接口。
- 依赖倒置原则:高层模块依赖于抽象协议,而不是具体实现。
- 里氏替换原则:不同的类实现相同协议,可以互换使用。
- 单一职责原则:将不同职责分离到不同的协议中,使得类的职责单一且明确。
这种设计方式使得代码更加灵活、可维护、可扩展,并且易于测试和复用。
在 Objective-C 中,通过协议提供匿名对象是一种设计模式,通常用于实现接口(协议)的一致性和灵活性。这个设计模式有助于实现松耦合、提高可扩展性和维护性。我们可以从以下几个设计原则来分析和理解这种做法:
1. 接口隔离原则(Interface Segregation Principle)
接口隔离原则是指应将庞大的接口拆分成更小、更具体的接口,使得客户端只需依赖于它们实际需要的接口。在 Objective-C 中,通过协议来定义接口,可以确保类只实现其需要的协议方法。
示例
@protocol Downloadable <NSObject>
- (void)download;
@end@protocol Uploadable <NSObject>
- (void)upload;
@end@interface MyClass : NSObject <Downloadable, Uploadable>
@end@implementation MyClass
- (void)download {// 实现下载逻辑
}- (void)upload {// 实现上传逻辑
}
@end
通过这种方式,MyClass 可以选择性地实现 Downloadable 和 Uploadable 协议,而不需要实现庞大的单一接口。
2. 依赖倒置原则(Dependency Inversion Principle)
依赖倒置原则强调高层模块不应该依赖于低层模块,而应该依赖于抽象。在 Objective-C 中,通过协议来定义接口,使得高层模块可以依赖于这些协议,而不是具体的实现类。
示例
@protocol DataProcessor <NSObject>
- (void)processData:(NSData *)data;
@end@interface DataHandler : NSObject
@property (nonatomic, weak) id<DataProcessor> processor;
- (void)handleData:(NSData *)data;
@end@implementation DataHandler
- (void)handleData:(NSData *)data {[self.processor processData:data];
}
@end
通过这种方式,DataHandler 依赖于 DataProcessor 协议,而不是具体的实现类,这使得 DataHandler 更加灵活,可以适配不同的 DataProcessor 实现。
3. 里氏替换原则(Liskov Substitution Principle)
里氏替换原则强调,子类对象必须能够替换其基类对象而不会导致程序错误。在 Objective-C 中,通过协议提供匿名对象,可以确保不同类实现相同的协议,并且可以互换使用。
示例
@protocol Animal <NSObject>
- (void)speak;
@end@interface Dog : NSObject <Animal>
@end@implementation Dog
- (void)speak {NSLog(@"Woof!");
}
@end@interface Cat : NSObject <Animal>
@end@implementation Cat
- (void)speak {NSLog(@"Meow!");
}
@endvoid makeAnimalSpeak(id<Animal> animal) {[animal speak];
}Dog *dog = [Dog new];
Cat *cat = [Cat new];makeAnimalSpeak(dog); // 输出 "Woof!"
makeAnimalSpeak(cat); // 输出 "Meow!"
在这个例子中,Dog 和 Cat 都实现了 Animal 协议,可以互换使用而不影响 makeAnimalSpeak 函数的逻辑。
4. 单一职责原则(Single Responsibility Principle)
单一职责原则指的是一个类应该只有一个引起变化的原因,即一个类只负责一项职责。通过协议提供匿名对象,可以将不同的职责分离到不同的协议中,使得每个类只负责实现特定的协议。
示例
@protocol Logger <NSObject>
- (void)logMessage:(NSString *)message;
@end@interface ConsoleLogger : NSObject <Logger>
@end@implementation ConsoleLogger
- (void)logMessage:(NSString *)message {NSLog(@"%@", message);
}
@end@interface FileLogger : NSObject <Logger>
@end@implementation FileLogger
- (void)logMessage:(NSString *)message {// 将日志写入文件
}
@endvoid performLogging(id<Logger> logger, NSString *message) {[logger logMessage:message];
}ConsoleLogger *consoleLogger = [ConsoleLogger new];
FileLogger *fileLogger = [FileLogger new];performLogging(consoleLogger, @"This is a console log.");
performLogging(fileLogger, @"This is a file log.");
在这个例子中,ConsoleLogger 和 FileLogger 都实现了 Logger 协议,但它们的职责是不同的(一个将日志输出到控制台,另一个将日志输出到文件)。
相关文章:
Objective-C之通过协议提供匿名对象
概述 通过协议提供匿名对象的设计模式,遵循了面向对象设计的多项重要原则: 接口隔离原则:通过定义细粒度的协议来避免实现庞大的接口。依赖倒置原则:高层模块依赖于抽象协议,而不是具体实现。里氏替换原则࿱…...
C语言基础(一)
C语言基础 一、标准输出(格式化输出):1、概念:2、注意语法点:3、格式控制符:4、调试技巧:5、代码风格:6、实例: 二、数据类型:1、整型概念:语法&a…...
机器学习_决策树与随机森林
决策树是一种常用的监督学习算法,既可以用于分类任务也可以用于回归任务。决策树通过递归地将数据集划分成更小的子集,逐步建立树结构。每个节点对应一个特征,树的叶子节点表示最终的预测结果。构建决策树的关键是选择最佳的特征来分割数据&a…...
嵌入式系统日志轮转:实现与性能考量
日志轮转是嵌入式系统中管理日志文件的一种常用技术,它通过创建新的日志文件来替代旧的日志文件,从而避免日志文件无限增长,占用过多存储空间。本文将探讨日志轮转的实现方法以及在嵌入式系统中实现日志轮转时需要考虑的性能因素。 一、日志…...
麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快
全球顶级咨询公司麦肯锡(McKinsey & Company)在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》,一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…...
Vue Router 使用教程
Vue Router 是 Vue.js 的官方路由管理器,它提供了一种方便的方式来管理应用的路由。在本教程中,我们将介绍 Vue Router 的一些常见用法和示例。 一、安装 Vue Router 使用 Vue Router 之前,需要先安装它。可以使用以下命令通过 npm 安装&am…...
银河麒麟解压命令
银河麒麟(Kylin)操作系统是基于Linux的操作系统分支之一,其使用的解压命令与Linux系统中的命令基本相同。 在银河麒麟系统中,常用的解压命令有以下几种: 对于.tar文件: tar -xvf file.tar对于.tar.gz或.…...
VSCode打开文件总是在当前标签页打开,不是新增标签页
修改 VS Code 设置 打开设置: 按 Ctrl , 或者点击右下角的齿轮图标,然后选择 “Settings”。 搜索设置: 在设置搜索栏中输入 workbench.editor.enablePreview。 禁用预览模式: 找到 Workbench > Editor: Enable Preview 选…...
Django redirect()函数实现页面重定向
1,通过路由反向解析进行重定向 1.1 添加视图函数 myshop/app2/views.py from django.http import HttpResponse from django.shortcuts import render from django.urls import reverse def index(request):return HttpResponse("app2 的index")# 反向…...
【运维项目经历|029】NTP精准时间同步系统优化项目
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目...
机房网络运维服务项目难点与关键点分析
随着信息技术的飞速发展,机房作为支撑企业信息化建设的核心枢纽,其网络运维服务的重要性日益凸显。然而,在实际运维过程中,运维团队常常面临诸多难点和挑战。本文将围绕机房网络运维服务项目的难点和关键点进行深入分析࿰…...
MKS AX7680 SERIES 电源使用说明手侧
MKS AX7680 SERIES 电源使用说明手侧...
DVWA-XSS(Reflected)
反射型XSS可以用来窃取cookie Low 输入1111进行测试,发现1111被打印 输入<script>alert(document.cookie)</script>,出现弹窗,获得cookie Medium 查看后端代码,发现对<script>进行了转义,但是…...
Python自动化办公2.0 即将发布
第一节课:数据整理与清洗 第二节课:数据筛选、过滤与排序 第三节课:高级数据处理技巧 第四节课:数据可视化与实践案例 第五节课:统计分析与报表 第六节:常见的Excel报表 与下方的课程形成知识体系&…...
【面试宝藏】Redis 常见面试题解析其二
Redis 高级面试题解析 20. 说说 Redis 哈希槽的机制? Redis 集群采用哈希槽(Hash Slot)机制来分布和管理数据。整个哈希空间被划分为 16384 个槽,每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽&#…...
智慧公厕厂家+智能厕所小程序,构建数字化公厕新体系
在现代社会的诸多场景中,公厕扮演着重要却常常被忽视的角色。尤其是在传统的楼宇中,公厕存在着一系列痛点问题。 一、传统公厕问题 传统楼宇公厕常常面临着布局不合理的困境,导致使用者寻找困难,浪费时间和精力。卫生状况也是一大…...
使用迁移助手 (SSMA for Oracle) 将Oracle19c数据库迁移到SQL Server2022
如何使用适用于 Oracle 的 SQL Server 迁移助手Microsoft SQL Server Migration Assistant for Oracle (SSMA for Oracle) 将 Oracle 数据库迁移到 SQL Server Microsoft SQL Server Migration Assistant (SSMA) for Oracle is a tool to automate migration from Oracle data…...
LabVIEW开发EOL功能测试系统
LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案,涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试,确保运行可靠并支持未来的升级需求…...
Java finally catch try关键字
Java finally catch try关键字 finally: finally 关键字用来创建在 try 代码块后面执行的代码块;无论是否发生异常,finally 代码块中的代码总会被执行。 在 finally 代码块中,可以进行文件流关闭等收尾善后性质的语句 catch&am…...
docker安装mysql8和mysql5.7
1.docker安装mysql5.7,请点击此链接 2.docker安装mysql8并挂载数据卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
