七大原则之 依赖倒置原则
- 依赖导致原则:
上层不能依赖于下层
它们都应该依赖于抽象
- 什么是上层? 什么是下层?
调用别方法,就是上层,被其它方法调用的, 就是下层
例如:
class A {
public void method() {
}
}
class B {
public void test() {
A a = new A();
a.method();
}
}
public class Demo {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.method();
b.test();
}
}
- 这里Demo的主函数里面调用 A和B类的方法 所有
这个Demo是A,B两个的上层
,A,B是下层
- B类又调用A类的方法, 所有相对来说,
B是A类的上层
,A是下层
.
反例:
class Person {
public void feed(Dog dog) {
System.out.println("开始喂养...");
dog.eat();
}
}
class Dog {
public void eat() {
System.out.println("狗啃骨头");
}
}
//=======================时空线=============================
//=========上面为服务端(提供服务,作者),下面为客户端(使用服务)=====
public class AppTest {
public static void main(String[] args) {
Person person = new Person();
Dog dog = new Dog();
person.feed(dog);
}
}
这样看着没问题.但是过了一段时间,突然想要加个猫类
//客户端自己定义一个猫类
class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
}
但是这是我们Person并没有它的方法,于是必须去Person重载feed的方法
class Person {
public void feed(Dog dog) {
System.out.println("开始喂养...");
dog.eat();
}
//重载的定义的喂猫的方法
public void feed(Cat cat) {
System.out.println("开始喂养...");
cat.eat();
}
}
每次想要喂养一个新的动物,除了写对应的动物类之后,每次都得去重载Person类里面的feed方法
此时,这种代码违反了开闭原则,因为上面的代码是作者写的,我们只是调用,并且违反了依赖倒置原则,因为,每当下层变动时,上层都要跟着一起变动
我们希望的是,当下层新增一个动物时,上层应该“不知道”,上层代码应该不用改动!
正例:
//使用动物接口
interface Animal {
void eat();
}
//人这个类调用动物接口的吃方法
class Person {
public void feed(Animal animal) {
System.out.println("开始喂养...");
animal.eat();
}
}
//狗实现动物这个接口
class Dog implements Animal{
public void eat() {
System.out.println("狗啃骨头");
}
}
//这时直接就可以调用了
public class AppTest {
public static void main(String[] args) {
Person person = new Person();
Dog dog = new Dog();
person.feed(dog);
}
}
这时我们想要加一个猫类或者虎类,只需要写完去实现动物类的接口
class Cat implements Animal{
public void eat() {
System.out.println("猫吃鱼");
}
}
class Tiger implements Animal {
@Override
public void eat() {
System.out.println("老虎吃鸡");
}
}
这时我们根本不需要去修改或者重载Person里面的方法
这样不管以后我们需要增加多少个动物…都只需要去实现动物接口
,此时上层Person
无需改变,上层也不知道改变.