每天三分钟学习设计原则-依赖倒置原则

学习目标:

依赖倒置原则的定义
依赖倒置的代码实现

依赖倒置的优点


定义:

定义:高层模块不应该底层模块,二者都应该依赖其抽象

扩展:1.抽象不应该依赖细节,细节依赖于抽象

         2.要针对接口编程,不要针对实现编程


代码示例:

提示:以一个简单的学习为例
例如:tom喜欢学习,并且学习java课程,也学习python课程

 

public class Tom {

    //Tom爱学习,

    //学习Java课程
    public  void studyJvava(){
        System.out.println("Tom在学习java课程");
    }
    //学习Python课程
    public void studyPython(){
        System.out.println("Tom在学习Python课程");
    }
}
public class Test {
    public static void main(String[] args) {
        //v1
        Tom tom=new Tom();
        tom.studyJvava();
        tom.studyPython();
   }
}

在上述例子中我们发现,假设tom现在又想学习大数据的知识,这时候就需要修改代码了,是不是违背了开闭原则

public class Tom {

    //Tom爱学习,

    //学习Java课程
    public  void studyJvava(){
        System.out.println("Tom在学习java课程");
    }
    //学习Python课程
    public void studyPython(){
        System.out.println("Tom在学习Python课程");
    }
  //学习大数据课程
    public void studyBigData(){
        System.out.println("Tom在学习大数据课程");
    }
 }
}

 那我们怎么解决问题呢?

可以定义一个课程接口,提供一个学习的方法,让java,python,大数据......实现这个接口,这样在增加新的课程学习的时候就只需要实现课程接口即可:

public interface Icourse {
    void study();
}
public class JavaCourse implements Icourse {
    @Override
    public void study() {
        System.out.println("Tom在学习java课程");
    }
}
public class PythonCourse implements Icourse {
    @Override
    public void study() {
        System.out.println("Tom在学习Python课程"
        );
    }
}

 这需要对tom的类加以修改

public class Tom {

    //Tom爱学习,

    public void study(Icourse icourse){
        icourse.study();

    }
public class Test {
    public static void main(String[] args) {
       
        //v2
        Tom tom=new Tom();
        tom.study(new JavaCourse());
}
}

 这里还可以这样修改,将课程作为tom的私有变量,通过构造方法来实现

public class Tom {

    //Tom爱学习,

   
    private Icourse icourse;

    public void study(){
        icourse.study();
    }

  
    public Tom(Icourse icourse) {
        this.icourse = icourse;
    }
public class Test {
    public static void main(String[] args) {
       
       //v3
        Tom tom=new Tom(new JavaCourse());
        tom.study();
  }
}

 这里还可以通过set方法给私有变量赋值来实现:

public class Tom {

    //Tom爱学习,

    private Icourse icourse;

    public void study(){
        icourse.study();
    }

   
    public void setIcourse(Icourse icourse) {
        this.icourse = icourse;
    }

    public Tom(Icourse icourse) {
        this.icourse = icourse;
    }
}
public class Test {
    public static void main(String[] args) {
        //v4
        Tom tom=new Tom();
        tom.setIcourse(new JavaCourse());
        tom.study();
    }
}

 


优点:

可以减少类与类之间的耦合性,提高程序的扩展性,提高程序的稳定性,提高代码可读性和稳定性,减少了修改程序代码造成的风险

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值