依赖倒置,面向接口编程

依赖倒置

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 场景:列表中依赖 modelA 的数据来构建卡片,所以列表直接依赖 A,但这时列表中又添加了 modelB modelC modelD …… 按照原本的实现方式就需要去更改列表的实现,且会写很多 ifelse 的判断,列表的实现是更上层业务,频繁的修改不但加重列表逻辑,而且会带了更大的风险。 解决方案:列表不直接依赖于具体的 model,而是依赖抽象的接口I,这些接口抽象出所有 model 都需要提供的信息。

具体实现

在 iOS 中协议就可以帮助我们实现这一抽象过程:

@protocol IDelegate <NSObject>
- (id)method1
- (id)method2
@end

列表中的各种 model 都去实现 IDelegate 协议,提供 method1,method2 方法

卡片的实现就可以变为:

- (instancetype)initWithModel:(id <IDelegate>)model {
    
}

之后如果再增加新的 model 类型,只要让新 model 实现 IDelegate 协议即可,不需要再去更改列表和卡片的逻辑了。