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

概述

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

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

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


在 Objective-C 中,通过协议提供匿名对象是一种设计模式,通常用于实现接口(协议)的一致性和灵活性。这个设计模式有助于实现松耦合、提高可扩展性和维护性。我们可以从以下几个设计原则来分析和理解这种做法:

1. 接口隔离原则(Interface Segregation Principle)

接口隔离原则是指应将庞大的接口拆分成更小、更具体的接口,使得客户端只需依赖于它们实际需要的接口。在 Objective-C 中,通过协议来定义接口,可以确保类只实现其需要的协议方法。

示例
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 中,通过协议来定义接口,使得高层模块可以依赖于这些协议,而不是具体的实现类。

示例
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 中,通过协议提供匿名对象,可以确保不同类实现相同的协议,并且可以互换使用。

示例
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!"

在这个例子中,Dog 和 Cat 都实现了 Animal 协议,可以互换使用而不影响 makeAnimalSpeak 函数的逻辑。

4. 单一职责原则(Single Responsibility Principle)

单一职责原则指的是一个类应该只有一个引起变化的原因,即一个类只负责一项职责。通过协议提供匿名对象,可以将不同的职责分离到不同的协议中,使得每个类只负责实现特定的协议。

示例
objective-c 复制代码
@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.");

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

相关推荐
ii_best8 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
美狐美颜SDK开放平台9 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
程序鉴定师18 小时前
2026年深圳小程序/App开发公司技术选型指南:从架构设计到交付标准全维度评估
java·小程序·uni-app·php·objective-c
传奇开心果编程2 天前
【SwiftUI入门练中学】第7课 动画与手势:让界面更灵动
学习·macos·ui·ios·swiftui·swift
知潮网2 天前
发售刚十天,9999 元的 iPhone 18 Pro 解锁就重启
ios·iphone
2501_916007472 天前
苹果应用商店App Store上架费用标准及原因解析
android·ios·小程序·https·uni-app·iphone·webview
传奇开心果编程2 天前
【SwiftUI娓娓道来】第3课:让界面活起来——交互与动画指南
学习·macos·ui·ios·swiftui·swift
可乐鸡翅yeah_2 天前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
朋友圈自动点赞工具2 天前
Gmail 委托邮箱在手机上关不掉
macos·智能手机·cocoa·硬件评测
00后程序员张3 天前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview