快速理解 SOLID (面向对象设计)——依赖倒置原则

比特织月人
• 阅读 2912

快速理解 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 (面向对象设计)——依赖倒置原则

SOLID (面向对象设计)——单一职责原则,你学会了吗?

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
zdd小小菜鸟 zdd小小菜鸟
2年前
设计模式–六大原则
设计模式–六大原则tex在238中设计模式中,我们提炼出了六大面向对象设计原则我们可以不知道那数量繁多的设计模式,但一定要记住这六大设计原则1.开闭原则(OpenClosePrinciple
zdd小小菜鸟 zdd小小菜鸟
2年前
设计模式面试
设计模式面试1.单例设计模式使用设计模式为了代码复用,增加可维护性。设计模式的六大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则(最少知道原则)、合成/聚合复用原则Singleton(创建):保证一个类仅
xiguaapp xiguaapp
4年前
一句话总结java七大设计原则
开闭原则:对扩展开放,对修改关闭。依赖倒置原则:高层应该不依赖地层。单一职责原则:一个类只干一件事儿。接口隔离原则:一个接口只干一件事儿迪米特法则:不该知道的就不要知道。里氏替换原则:子类重写方法功能发生改变,但是不影响父类方法的语义。合成复用原则:尽量使用组合实现代码复用,不要用继承,要解耦。
亚瑟 亚瑟
4年前
面向对象设计原则
面向对象设计原则对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。7种常用的面向对象设计原则|设计原则名称|定义|使用频率||
Wesley13 Wesley13
3年前
GOF二十三种设计模式之工厂模式
先说一下面向对象设计的基本原则:OCP:开放原则,一个软件的实体应当对扩展开放,对修改关闭。DIP:依赖倒转原则,针对接口编程,不要针对实现编程。LoD:迪米特法则,只与直接相关的类通信,避免和陌生人通信。在平常的编程中,我们都是直接new一个对象,而在工厂模式中,将对象的创建统一进行管理和控制,将调用者与实现类进行解耦。下边是一个简单的
Wesley13 Wesley13
3年前
Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦。详细分类:1)简单工厂模式(静态工厂模式);2)工厂方法模式;3)抽象工厂模式面向对象设计的基本原则:1)      OCP(开闭原则,OpenClosedPrinciple):一个软件的实体应当对扩展开放,对修改关闭。2)      
可莉 可莉
3年前
20175212童皓桢 Java实验二
20175212童皓桢Java实验二面向对象程序设计实验报告实验内容初步掌握单元测试和TDD理解并掌握面向对象三要素:封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式实验步骤
Stella981 Stella981
3年前
20175212童皓桢 Java实验二
20175212童皓桢Java实验二面向对象程序设计实验报告实验内容初步掌握单元测试和TDD理解并掌握面向对象三要素:封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式实验步骤
Wesley13 Wesley13
3年前
Java 面向对象的设计原则
一、1、面向对象思想的核心:封装、继承、多态。2、面向对象编程的追求:  高内聚低耦合的解决方案;  代码的模块化设计;3、什么是设计模式:  针对反复出现的问题的经典解决方案,是对特定条件下(上下文)问题的设计方案的经验总结,是前人设计实践经验的精华。4、面向对象设计原则