一. 依赖倒置原则
1. 定义
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
通俗的来说:就是面向接口(或抽象类)编程。
补充说明:
(1). 依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户端与实现模块之间的耦合。
(2). 由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。这里的抽象指的是接口或者抽象类,而细节是指具体的实现类。
(3). 使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成。
2. 作用
(1). 依赖倒置原则可以降低类间的耦合性。
(2). 依赖倒置原则可以提高系统的稳定性。
(3). 依赖倒置原则可以减少并行开发引起的风险。
(4). 依赖倒置原则可以提高代码的可读性和可维护性。
3. 实现方法和案例
(1). 实现的时候要注意这几点:
A. 每个类尽量提供接口或抽象类,或者两者都具备。
B. 变量的声明类型尽量是接口或者是抽象类。
C. 任何类都不应该从具体类派生。
D. 使用继承时尽量遵循里氏替换原则。
(2). 案例
业务层中的UserService1直接依赖MySQLHelp,如果要改连接SQLServer数据库,不得不改业务代码。 而UserService2类,依赖的是ISqlHelp接口,高层调用的时候,需要连接哪个数据库,直接传入即可。
数据库相关类
/// <summary> /// 数据库连接抽象接口 /// </summary> public interface ISqlHelp { public bool IsExist(string userAccount,string userPwd); public void Add(); public void Del(); public void Modify(); } /// <summary> /// MySQL帮助类 /// </summary> public class MySQLHelp : ISqlHelp { public bool IsExist(string userAccount, string userPwd) { Console.WriteLine($"MySQL数据库查询用户是否存在"); return true; } public void Add() { Console.WriteLine($"MySQL数据库Add成功"); } public void Del() { Console.WriteLine($"MySQL数据库Del成功"); } public void Modify() { Console.WriteLine($"MySQL数据库Modify成功"); } } /// <summary> /// SQLServer数据库操作类 /// </summary> public class SQLServerHelp : ISqlHelp { public bool IsExist(string userAccount, string userPwd) { Console.WriteLine($"sqlserver数据库查询用户是否存在"); return true; } public void Add() { Console.WriteLine($"sqlserver数据库Add成功"); } public void Del() { Console.WriteLine($"sqlserver数据库Del成功"); } public void Modify() { Console.WriteLine($"sqlserver数据库Modify成功"); } }