java设计原则之二----依赖倒转原则、里氏代换原则

     放平心态慢慢厉害,不动声色慢慢发光!

1、依赖倒转原则和里氏代换原则

  依赖倒转原则定义:抽象不应该依赖细节,细节应该依赖与抽象;换一句话讲就是应该针对接口编程,不应该针对实现编程;依赖倒转的意思的就是两个模块谁也不能依赖谁,除了约定的接口,大家都可以灵活自如;

  里氏代换原则定义:子类型必须能够替换掉它们的父类型;只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为;换一句话说就是子类在继承父类的时候,尽量不要去重写父类的方法。

  综合就是一句话:程序的开发应该面向对象,而不是面向过程。

2、上代码,这是一个很简单的demo:

  public class BenzCar {

    public void run () {
    System.out.printf("开奔驰!");
    }

  }

  public class Driver {

    public void drive (BenzCar car) {
      car.run();
    }

  }

  public class Test {

    public static void main(String[] args) {

      Driver lisi = new Driver();
      lisi.drive(new BenzCar());

    }

  }

  输出:

  开奔驰!

  上面这段代码很简单,就是一个李四开奔驰。

  但是突然来了一个需求,说不开奔驰了,让李四开奥迪吧,这时候上面的代码会有大麻烦,因为司机类不能用了;

  所以这就是一个典型的面向过程开发的代码,仅仅满足那时候的需求,但是当需求变更或者增加时,代码就需要重构了。

下面我们把上面的代码改造一下,改造成面向接口的开发代码:

public interface ICar {
void run ();
}

public interface IDriver {
void drive();
}

public class Driver implements IDriver {
ICar car;
public Driver (ICar car) {
this.car = car;
}

public void drive() {
car.run();
}
}

public class BenzCar implements ICar {
public void run() {
System.out.println("开奔驰了!");
}
}

public class AodiCar implements ICar {
public void run() {
System.out.println("开奥迪车了!");
}
}

public class Test {

public static void main(String[] args) {
Driver lisi = new Driver(new BenzCar());
lisi.drive();
Driver zhaosi = new Driver(new AodiCar());
zhaosi.drive();
}
}

改造完的代码可以明显感觉到,司机可以变,汽车品牌可以变,怎么变都很简单,都不影响主体功能--开车。
这里面就是依赖倒转的好处,谁也不依赖谁,大家各过各的,有需求就沟通,没需求或者你改动了,只要你的接口没变,我就能适应你。

当然,这里面没有使用里氏代换原则,因为我这里都是用的接口。
我也是在不断学习中,如果有什么不对的地方,欢迎指正!

  

原文地址:https://www.cnblogs.com/tengri-fighting/p/12669942.html