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

news2024/12/24 22:07:29

在这里插入图片描述

概述

通过协议提供匿名对象的设计模式,遵循了面向对象设计的多项重要原则:

  • 接口隔离原则:通过定义细粒度的协议来避免实现庞大的接口。
  • 依赖倒置原则:高层模块依赖于抽象协议,而不是具体实现。
  • 里氏替换原则:不同的类实现相同协议,可以互换使用。
  • 单一职责原则:将不同职责分离到不同的协议中,使得类的职责单一且明确。

这种设计方式使得代码更加灵活、可维护、可扩展,并且易于测试和复用。


在 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 可以选择性地实现 DownloadableUploadable 协议,而不需要实现庞大的单一接口。

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!");
}
@end

void makeAnimalSpeak(id<Animal> animal) {
    [animal speak];
}

Dog *dog = [Dog new];
Cat *cat = [Cat new];

makeAnimalSpeak(dog); // 输出 "Woof!"
makeAnimalSpeak(cat); // 输出 "Meow!"

在这个例子中,DogCat 都实现了 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 {
    // 将日志写入文件
}
@end

void 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.");

在这个例子中,ConsoleLoggerFileLogger 都实现了 Logger 协议,但它们的职责是不同的(一个将日志输出到控制台,另一个将日志输出到文件)。

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

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

相关文章

计算机毕业设计 | SpringBoot+vue的教务管理系统

1&#xff0c;绪论 1.1 项目背景 在这个资讯高度发展的时代&#xff0c;资讯管理变革已经是一个更为宽泛、更为全面的潮流。为了保证中国的可持续发展&#xff0c;随着信息化技术的不断进步&#xff0c;教务管理体系也在不断完善。与此同时&#xff0c;伴随着信息化的飞速发展…

Golang-分离式加载器(传参)AES加密

目录 enc.go 生成: dec.go --执行dec.go...--上线 cs生成个c语言的shellcode. enc.go go run .\enc.go shellcode 生成: --key为公钥. --code为AES加密后的数据, ----此脚本每次运行key和code都会变化. package mainimport ("bytes""crypto/aes"&…

好书推荐之《生成式 AI 入门与亚马逊云科技AWS实战》

最近小李哥在亚马逊云科技峰会领到了一本关于如何在云计算平台上设计、开发GenAI应用的书&#xff0c;名字叫&#xff1a;《生成式 AI 入门与亚马逊云科技AWS实战》&#xff0c;今天仔细看了下&#xff0c;发现这本书讲的真的很好&#xff01;他涵盖了当下AI领域所有热门的技术…

《精通ChatGPT:从入门到大师的Prompt指南》第11章:Prompt与AI的未来

第11章&#xff1a;Prompt与AI的未来 11.1 技术发展的新方向 在迅速发展的人工智能领域&#xff0c;Prompt工程作为与AI模型交互的核心方式&#xff0c;正处于技术创新的前沿。未来几年&#xff0c;Prompt工程将沿着多个新方向发展&#xff0c;这些方向不仅会改变我们与AI互动…

Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路

技术背景 Android平台推流模块&#xff0c;添加文字或png水印&#xff0c;不是一件稀奇的事儿&#xff0c;常规的做法也非常多&#xff0c;本文&#xff0c;我们主要是以大牛直播SDK水印迭代&#xff0c;谈谈音视频行业的精进和工匠精神。 第一代&#xff1a;不可动态改变的文…

[ROS 系列学习教程] 建模与仿真 - ros_control 介绍

ROS 系列学习教程(总目录) 本文目录 一、ros_control 架构1.1 hardware_interface1.2 combined_robot_hw1.3 controller_interface1.4 controller_manager1.5 controller_manager_msgs1.6 joint_limits_interface1.7 transmission_interface1.8 realtime_tools 二、ros_control…

LLVM Cpu0 新后端9 objdump readelf

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

Android——热点开关(优化中)

SoftAP打开与关闭 目录 1.三个名词的解释以及关系 Tethering——网络共享&#xff0c;WiFi热点、蓝牙、USB SoftAp——热点(无线接入点)&#xff0c;临时接入点 Hostapd——Hostapd是用于Linux系统的软件&#xff0c;&#xff0c;支持多种无线认证和加密协议&#xff0c;将任…

AI大模型在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例&#xff1a;多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

R语言统计分析——数据集概念和数据结构

参考资料&#xff1a;R语言实战.第2版 1、数据集的概念 数据集通常是由数据构成的一个矩形数组&#xff0c;行表示观测&#xff0c;列表示变量。 不同行业对于数据集的行和列叫法不同。统计学称为观测&#xff08;observation&#xff09;和变量&#xff08;variable&#xff…

Nginx高级配置及重写功能

文章目录 一、高级配置网页的状态页Nginx第三方模块变量访问日志Nginx压缩功能https功能自定义小图标 二、重写功能&#xff08;rewrite&#xff09;if指令return指令set指令break指令rewrite指令防盗链 一、高级配置 网页的状态页 状态页显示的是整个服务器的状态而非虚拟主…

LabVIEW在高校中的应用

LabVIEW 作为一款功能强大的图形化编程工具&#xff0c;在高校中有广泛的应用。它不仅用于教学实验&#xff0c;还广泛应用于科研项目和工程训练。本文将从教学、科研、实验室管理和学生技能培养等多个角度&#xff0c;详细分析LabVIEW在高校中的应用。 教学应用 课程设计 自动…

力扣2444.统计定界子数组的数目

力扣2444.统计定界子数组的数目 观察到不满足条件的数 可以作为天然的分割线 因此在枚举右端点的过程中 预处理minK&#xff0c;maxK和分割线上一次出现的下标 res min(min_i,max_i) - i0; 但是因为可能在到下个区段时 min_i和max_i尚未更新 导致结果为负数 所以要跟0再取一…

《Brave New Words 》2.2 阅读理解的未来,让文字生动起来!

Part II: Giving Voice to the Social Sciences 第二部分&#xff1a;为社会科学发声 The Future of Reading Comprehension, Where Literature Comes Alive! 阅读理解的未来&#xff0c;让文字生动起来&#xff01; Saanvi, a ninth grader in India who attends Khan World S…

SOA的设计模式_2.企业服务总线模式

1.企业服务总线&#xff08;|Enterprise Service Bus&#xff0c;ESB&#xff09; 在企业基于SOA实施EAI、B2B和BMP的过程中&#xff0c;如果采用点对点的集成方式存在着复杂度高&#xff0c;可管理性差&#xff0c;复用度差和系统脆弱等问题。企业服务总线&#xff08;…

vuInhub靶场实战系列--Kioptrix Level #2

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

打字侠是一款PWA网站,如何下载到电脑桌面?

嘿&#xff0c;亲爱的键盘侠们&#xff01; 你是否还在为寻找一款好用的打字练习工具而烦恼&#xff1f;别担心&#xff0c;今天我要给大家介绍一位超级英雄——打字侠&#xff01;它不仅是一个超级酷的打字练习网站&#xff0c;还是一款PWA&#xff08;渐进式网页应用&#x…

Python程序操作MySQL数据库教程

1.Python程序操作MySQL数据库&#xff1a; 使用pymysql安装包 使用&#xff1a; 1.导入pysql包 import pymysql 2.创建连接对象 调用pymysql模块中的connect&#xff08;&#xff09;函数来创建连接对象&#xff0c;代码如下&#xff1a; 连接对象说明&#xff1a; 关闭连接 co…

JAVA:通过电信ctg.ag.sdk从电信物联平台AIOT获取设备上报数据的简单示例

一、问题场景 物联设备比如NB设备通过NB协议将数据传到电信平台后&#xff0c;我们的应用服务如何从电信平台获取可用的上报数据。以下通过电信开发者平台提供的SDK来简单演示下整个过程。 二、使用电信 SDK进行开发 电信AIOT物联平台提供了两种方式获取平台数据&#xff0c…