快速理解 SOLID (面向对象设计)——依赖倒置原则
在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转),指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。
1. 依赖倒置原则
1.1 依赖倒置原则 的定义
一个方法应该遵从“依赖于抽象而不是一个实例”
1.2 依赖倒置原则 解决了什么问题
一开始类A依赖于类B,由于需求发生了改变。要将类A依赖于类C,则我们需要修改类A依赖于类B的相关代码,这样会对程序产生不好的影响。假如需求又发生了改变,我们又需要修改类A的代码。
1.3 依赖倒置原则 举个例子
public class UserService { private Plaintext plaintext; // 明文登录注册 public void register(){ Plaintext.register(); // 调用明文的注册方法 } public void login(){ Plaintext.login(); // 调用明文的登录方法 }}
上面的例子可以看出,UserService
类依赖于Plaintext
类。有一天,由于使用明文登录注册不安全,需求改为使用密文登录注册。我们可以怎么办?
//不符合 依赖倒置原则public class UserService { // private Plaintext plaintext; private Ciphertext ciphertext; // 密文登录注册 public void register(){ // Plaintext.register(); Ciphertext.register(); // 调用密文的注册方法 } public void login(){ // Plaintext.login(); Ciphertext.login(); // 调用密文的登录方法 }}
在上面的例子,修改一个需求几乎将整个UserService
类都修改了一遍,这不但麻烦,而且会给程序带来很多风险。所以上面的例子不符合依赖倒置原则。
//符合 依赖倒置原则public class UserService { private Authentication authentication; // 依赖于接口(抽象) public UserServer(Authentication auth) { //接口与实现类对接 this.authentication = auth; } public void register(){ authentication.register(); } public void login(){ authentication.login(); }}public interface Authentication { //...登录注册}public class Ciphertext implements Authentication { //...使用明文的实现}public class Plaintext implements Authentication { //...使用密文的实现}
在上面的例子Ciphertext
类和Plaintext
类实现了Authentication
接口。而UserService
类依赖于Authentication
接口。这样可以在构造函数里随意切换登录注册的模式。假设以后还需要更改需求,只需要实现Authentication
接口然后在构造函数里注入就可以了。
1.4 依赖倒置原则 的总结
- 依赖倒置原则大大的降低了代码的耦合度,使类和类之间关系不那么紧密。这样可以避免修改一点代码而带来大量的连锁反应。
- 依赖倒置原则的核心就是面向接口编程,理解了依赖倒置原则,也就理解了面向接口编程。
2. 关注我的微信公众号,查看更多文章,第一时间收到我的文章。
SOLID (面向对象设计)——单一职责原则,你学会了吗?