![bb696135aa5246b29463ee12460f4799.png](https://i-blog.csdnimg.cn/blog_migrate/7a0af794c3c1dd540efb559f28014e61.jpeg)
SOLID—依赖倒置原则
上一篇文章我们学习了SOLID中的接口隔离原则(I),如果还不了解接口隔离原则的的小伙伴可以先去看了我的这篇文章再回来噢想做软件开发得先搞懂软件的设计原则—SOLID原则之接口隔离
今天我们来学习SOLID的最后一个原则——依赖倒置原则(DIP);
依赖倒置原则的定义:
- 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
这句话基本上意味着,如果您对日志记录感兴趣,那么您的报告组件不应该依赖于具体的Logger类,而是依赖于ILogger接口。在这种情况下,我们认为报告组件是高层的(更接近业务领域),而日志记录则是基本的关注点被认为是低级模块。
- 抽象不应该依赖于细节。细节应该依赖于抽象。
这再次重申了对接口或基类的依赖要优于对具体类型的依赖。因为这种方法支持更好的可配置性和可测试性,前提是您使用一个良好的框架来处理这些依赖项(IOC框架)。
下面我们就已Report为例子把问题抛出来:
/// /// 报表 /// public class Report { ConsoleLogger logger = new ConsoleLogger();//依赖于ConsoleLogger public void Reporting() { Console.WriteLine("正在生成报表。。。"); logger.Logger(); } } /// /// 向控制台输出日志 /// public class ConsoleLogger { public void Logger() { Console.WriteLine("报表日志记录"); } }
调用:
static void Main(){ Report report = new Report(); report.Reporting();}
看起来没什么问题,假如客户要求把报表日志输出到文件中呢?这时候你是不是要求修改Report类了,因为Report类依赖于具体的日志类,如果修改Report的话就违反了开闭原则了,所以我们的Report类不应该应该于具体的日志类,而是依赖一个ILogger的接口,修改代码如下:
/// /// 报表 /// public class Report { private readonly ILogger _logger; public Report(ILogger logger) { _logger = logger; } public void Reporting() { Console.WriteLine("正在生成报表。。。"); _logger.Logger(); } } /// /// 向控制台输出日志 /// public class ConsoleLogger : ILogger { public void Logger() { Console.WriteLine("报表日志记录"); } } /// /// 把日志输出到文件中 /// public class LoggerToFile : ILogger { public void Logger() { Console.WriteLine("把日志输出到文件中"); } } public interface ILogger { void Logger(); }
调用:
static void Main() { ILogger logger = new LoggerToFile(); Report report = new Report(logger); report.Reporting(); }
这样Report类就不再依赖具体的日志类了,而是依赖日志接口,以后想要把日志输出到那里只要新增一个实现ILogger的类就行了。
以上就是SOLID中的依赖倒置原则啦,软件的面向对象设计原则就此告一段落了,接下来我们一起学习面向对象的各种设计模式啦,加油!