美文网首页
设计原则之:DIP/依赖反转原则

设计原则之:DIP/依赖反转原则

作者: WorldPeace_hp | 来源:发表于2021-02-25 22:11 被阅读0次

    Dependncy Inversion Principle\n依赖反转原则:指导如何抽象

    定义:

    1.高层模块不应该直接依赖底层模块,两者都应该依赖抽象层;
    2.抽象不能依赖细节,细节必须依赖抽象。

    适用范围:

    DIP原则:用于指导如何抽象
    DIP原则用于指导抽象出接口或者抽象类。

    来个例子看看~~~

    《不好的依赖》:

    违反了原则Player2直接使用了Ford类对象作为参数。
    1.Ford类修改,Player2类《需要》重新编译、测试。

    1. 有过多重复性代码。
    //使用
    - (void)noGoodDIP {
        DIPPlayer2 *player = [DIPPlayer2 new];
        [player play:[DIPFord new]];
        [player play1:[DIPBenz new]];
        [player play2:[DIPChery new]];
    }
    
    @interface DIPPlayer2 : NSObject
    - (void)play:(DIPFord *)car; //开福特
    - (void)play1:(DIPBenz *)car; //开奔驰
    - (void)play2:(DIPChery *)car; //开奇瑞
    @end
    
    @implementation DIPPlayer2
    
    - (void)play:(DIPFord *)car {
        [car accelerate];
        [car shift];
        [car steer];
        [car brake];
    }
    
    - (void)play1:(DIPBenz *)car {
        [car accelerate];
        [car shift];
        [car steer];
        [car brake];
    }
    
    - (void)play2:(DIPChery *)car {
        [car accelerate];
        [car shift];
        [car steer];
        [car brake];
    }
    
    @end
    
    《好的依赖》:

    对应原则“ DIPPlayer1(高)层模块不直接依赖DIPCar(底)层模块”,Player1依赖Car接口,Ford/Benz/Chery依赖Car接口,不需要知道具体车型。
    1.Ford,Benz,Chery类修改,Player1类“不需要”重新编译、测试。
    2.不需要过多重复性代码。

    // 使用
    - (void)goodDIP {
        DIPPlayer1 *player = [DIPPlayer1 new];
        [player play:[DIPFord new]];
        [player play:[DIPBenz new]];
        [player play:[DIPChery new]];
    }
    
    @interface DIPPlayer1 : NSObject
    - (void)play:(id<DIPCar>)car;//开车
    @end
    
    @interface DIPPlayer1 : NSObject
    - (void)play:(id<DIPCar>)car {
        [car accelerate];
        [car shift];
        [car steer];
        [car brake];
    }
    @end
    
    Car协议:
    @protocol DIPCar <NSObject>
    
    - (void)accelerate;//加速
    - (void)shift;//换挡
    - (void)steer;//转向
    - (void)brake;//刹车
    
    @end
    
    福特车实现DIPCar协议:
    @interface DIPFord : NSObject <DIPCar>
    @end
    
    @implementation DIPFord
    
    - (void)accelerate {NSLog(@"%s",__func__);}//加速
    - (void)shift {NSLog(@"%s",__func__);}//换挡
    - (void)steer {NSLog(@"%s",__func__);}//转向
    - (void)brake {NSLog(@"%s",__func__);}//刹车
    
    @end
    
    奔驰车实现DIPCar协议:
    @interface DIPBenz : NSObject <DIPCar>
    @end
    
    @implementation DIPBenz
    
    - (void)accelerate {NSLog(@"%s",__func__);}//加速
    - (void)shift {NSLog(@"%s",__func__);}//换挡
    - (void)steer {NSLog(@"%s",__func__);}//转向
    - (void)brake {NSLog(@"%s",__func__);}//刹车
    
    @end
    
    奇瑞车实现DIPCar协议:
    @interface DIPChery : NSObject <DIPCar>
    @end
    
    @implementation DIPChery
    
    - (void)accelerate {NSLog(@"%s",__func__);}  //加速
    - (void)shift {NSLog(@"%s",__func__);}       //换挡
    - (void)steer {NSLog(@"%s",__func__);}       //转向
    - (void)brake {NSLog(@"%s",__func__);}       //刹车
    
    @end
    

    相关文章

      网友评论

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

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