• 3_依赖倒置原则


    依赖倒置原则,简称DIP

    定义:1.高层模块不应该依赖底层模块;2.抽象不应该依赖细节;3.细节应该依赖抽象;(针对接口               编程,不应该针对实现编程)

    释义:1.高层模块与低层模块之间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依               赖关系是通过接口或抽象类产生的;
               2.接口类和抽象类不依赖于实现类;
               3.实现类依赖接口或抽象类;

    依赖的三种写法
    1.构造函数传递依赖对象;(见Driver脚本)
    2.Setter方法传递依赖对象;(见Driver脚本)
    3.接口声明依赖对象;(见IDriver脚本)

    依赖是可以传递的,A对象依赖B对象,B又依赖C,C又依赖D,生生不息,依赖不止
    只要做到抽象依赖,即使是多层的依赖传递也无所畏惧

    依赖倒置遵循规则:
    1.每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备(这是依赖倒置的基本要求,接口和抽象类都是属于抽象的,有了抽象才可能抽象倒置)
    2.变量的表面类型尽量是接口或者抽象类
    3.任何类都不应该从具体类派生
    4.尽量不要覆写基类的方法(如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要覆写。类间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会产生一定的影响)
    5.结合里氏替换原则使用(接口负责定义public属性和方法,并声明与其它对象的依赖关系,抽象类负责公共构造部分的是实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化)

    代码案例:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. ///
    5. /// 汽车接口
    6. ///
    7. public interface ICar
    8. {
    9. ///
    10. /// 是汽车就应该能跑
    11. ///
    12. void run();
    13. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class Benz : ICar
    5. {
    6. ///
    7. /// 奔驰车肯定会跑
    8. ///
    9. public void run()
    10. {
    11. Debug.Log("奔驰车开始运行......");
    12. }
    13. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class BMW : ICar {
    5. ///
    6. /// 宝马车肯定也会跑
    7. ///
    8. public void run()
    9. {
    10. Debug.Log("宝马车开始运行......");
    11. }
    12. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. ///
    5. /// 司机接口
    6. ///
    7. public interface IDriver {
    8. ///
    9. /// Setter方法注入
    10. ///
    11. ///
    12. void SetCar(ICar car);
    13. ///
    14. /// 是司机就应该会驾驶汽车
    15. ///
    16. ///
    17. void driver();
    18. ///接口声明依赖对象
    19. //void driver(ICar car);
    20. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class Driver : IDriver {
    5. private ICar car;
    6. 构造函数注入
    7. //public Driver(ICar _car)
    8. //{
    9. // this.car = _car;
    10. //}
    11. ///
    12. /// Setter方法注入
    13. ///
    14. ///
    15. public void SetCar(ICar car)
    16. {
    17. this.car = car;
    18. }
    19. ///
    20. /// 司机的主要职责就是驾驶汽车
    21. ///
    22. ///
    23. public void driver()
    24. {
    25. car.run();
    26. }
    27. }
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. ///
    5. /// 场景实现类
    6. ///
    7. public class Client03 : MonoBehaviour {
    8. // Use this for initialization
    9. void Start () {
    10. //张三开奔驰车
    11. IDriver zhangsan = new Driver();
    12. ICar benz = new Benz();
    13. zhangsan.SetCar(benz);
    14. zhangsan.driver();
    15. //张三开宝马车
    16. ICar bmw = new BMW();
    17. zhangsan.SetCar(bmw);
    18. zhangsan.driver();
    19. }
    20. // Update is called once per frame
    21. void Update () {
    22. }
    23. }

     

     

     

  • 相关阅读:
    flutter 身兼数职的getx —— 简介
    Windows下安装Mindspore CPU版本时出现warning
    网络安全(黑客)——2024自学
    【10套模拟】【2】
    在github上设置不同分支,方便回滚
    TensorFlow新文档发布:新增CLP、DTensor...最先进的模型已就绪
    【MySQL系列】 MySQL表的增删改查(进阶)
    已解决 IDEA Maven 项目中 “Could not find artifact“ 问题的常见情况和解决方案
    redis缓存一致性讨论
    小程序wx:if 和hidden的区别?
  • 原文地址:https://blog.csdn.net/duanworld/article/details/126653107