美文网首页
iOS设计原则之依赖反转

iOS设计原则之依赖反转

作者: 点滴86 | 来源:发表于2024-04-13 22:15 被阅读0次

    依赖反转原则

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

    相关文章

      网友评论

          本文标题:iOS设计原则之依赖反转

          本文链接:https://www.haomeiwen.com/subject/quplxjtx.html