iOS设计原则之依赖反转

2024-04-13  本文已影响0人  点滴86

依赖反转原则

依赖反转原则的英文是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

上一篇下一篇

猜你喜欢

热点阅读