设计模式之依赖倒转原则

依赖倒转原则

1.定义

A. 高层模块不应该依赖低层模块。两个都应该依赖抽象。
B. 抽象不应该依赖细节。细节应该依赖抽象

2.为什么要叫做倒转呢?

面向对象开发时,为了使得常用代码可复用,一般都会把这些代码写成许多的函数库,我们在做项目时调用这些底层的代码函数就可以了。比如我们做的项目大多低层模块。要访问数据库,所以我们就会把访问数据库的代码写成函数,每次做新的项目的时候去调用这些函数,这也叫做高层模块依赖。问题是我们要做新的项目时,发现业务的高层模块是一样的,但是客户却希望用不同的数据库或存储信息方式,这时候就麻烦了,低层与高层模块耦合度太高了,无法复用。

3.解决办法

无论是高层模块还是低层模块,他们都依赖于抽象,具体一点就是接口或者抽象类,只要接口是稳定点的,那么任何一个更改都不会影响其他模块。

4.实例

依赖倒置原则的核心就是接口,下面我们为车和司机定义两个接口ICar和IDriver,代码如下所示:

 /// <summary>
    /// 汽车接口
    /// </summary>
    public interface ICar
    {
        void Run();
    }
    /// <summary>
    /// 司机接口
    /// </summary>
    public interface IDriver
    {
        void Drive(ICar car);
    }

//实现接口

 /// <summary>
    /// 司机A实现接口
    /// </summary>
    public class DriverA : IDriver
    {
        public void Drive(ICar car)
        {
            car.Run();
        }
    }
    /// <summary>
    /// 司机B 实现接口
    /// </summary>
    public class DriverB : IDriver
    {
        public void Drive(ICar car)
        {
            car.Run();
        }
    }
    /// <summary>
    /// BMW车实现汽车的接口
    /// </summary>
    public class BMW : ICar
    {
        public void Run()
        {
            Console.WriteLine("开的是BMW");
        }
    }

    public class Benz : ICar
    {
        public void Run()
        {
            Console.WriteLine("开的是Benz");
        }
    }

客户端代码:

 class Program
    {
        static void Main(string[] args)
        {
            //一辆奔驰车

            var benz = new Benz();

            //司机A

            var xiaoming = new DriverA();

            //司机A开奔驰

            xiaoming.Drive(benz);

            Console.ReadKey();


        }
    }

5.UML类图

这里写图片描述

6.注意

  • 每一个类都要尽可能有接口或抽象类和两者都有,也不可过分去生搬硬套依赖倒置原则。
  • 变量的显示类型尽量是接口或者抽象类。
  • 尽量不要覆写基类的方法。
  • 结合里氏替换原则使用

7.源码

依赖倒转原则源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值