依赖反转原则
依赖反转原则的英文是Dependency Inversion Principle,缩写为DIP。英文描述为High-level modules shouldn't depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn't depend on details. Details depend on abstractions.翻译成中文就是:高层模块(high-level modules)不要依赖底层模块(low-level)。高层模块和底层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要以来具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。
所谓高层模块和底层模块的划分,简单来说就是,在调用链上,调用者属于高层,被调用者属于底层。在平时的业务代码开发中,高层模块依赖底层模块是没有任何问题的。实际上,这条原则主要还是用来指导框架层面的设计。
@interface DMLamp : NSObject
// 开灯
- (void)open;
// 关灯
- (void)close;
@end
@implementation DMLamp
- (void)open {
NSLog(@"灯亮了");
}
- (void)close {
NSLog(@"灯灭了");
}
@end
// 按钮
@interface DMButton : NSObject
// 按钮打开
- (void)open;
// 按钮关闭
- (void)close;
// 灯
@property (nonatomic, strong) DMLamp *mLamp;
@end
@implementation DMButton
- (void)open {
[self.mLamp open];
}
- (void)close {
[self.mLamp close];
}
@end
一个按钮控制灯的开关,正常情况下都是DMButton直接调用DMLamp的开关方法,这样存在着DMButton这个高层依赖底层DMLamp,如果当按钮需要控制其他设备时,将无法使用,那如何解除这个依赖关系呢,我们可以添加一个DMButton的DMButtonServerProtocol按钮服务接口,这个接口提供两个方法,开和关。然后DMButton依赖这个接口,DMLamp类去实现这个接口。代码更改后如下
@protocol DMButtonServerProtocol <NSObject>
- (void)open;
- (void)close;
@end
// 按钮
@interface DMButton : NSObject
// 按钮打开
- (void)open;
// 按钮关闭
- (void)close;
@property (nonatomic, strong) id<DMButtonServerProtocol> mServer;
@end
@implementation DMButton
- (void)open {
[self.mServer open];
}
- (void)close {
[self.mServer close];
}
@end
@interface DMLamp : NSObject <DMButtonServerProtocol>
@end
@implementation DMLamp
- (void)open {
NSLog(@"灯亮了");
}
- (void)close {
NSLog(@"灯灭了");
}
@end
如果以后再有设备需要被DMButton控制,只需要去实现这个接口就可以了,如下:
// 电视
@interface DMTelevison : NSObject <DMButtonServerProtocol>
@end
@implementation DMTelevison
- (void)open {
NSLog(@"电视打开了");
}
- (void)close {
NSLog(@"电视关闭了");
}
@end
网友评论