设计原则 —— 针对接口编程而不针对实现编程

0. 理解

  • 接口,定义了一堆空实现函数的接口,如下,是对其全部实现类的约束,即必须实现我(接口)事先规定的那些方法,以使得我在操纵父类接口(指向子类实现)时,获得一种操作上的一致性(多态),而忽视其子类具体实现上的差异,即封装变化;

    public interface Iterator {
        boolean hasNext();
        Object next();
    }

1. 针对接口编程是多态性的体现

  • 针对对象编程简单地说,就是传递的是具体的子类;
    • 而针对接口编程,传递的则是父类引用,这样便可发挥多态性“父类引用指向子类对象”的特点和优势;

来看一个简答的例子:

public interface Animal {
    ...
    public void makeSound();
}

具体到“狗”,需给出其实现:

public class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Wang! Wang!");
    }
}

同理可给出其他具体动物类(猪牛羊等)的叫声实现。此时如何传递动物的实例化对象,调用其叫声方法呢?

  • 针对实现编程:

    public void hearDogSound(Dog dog) {
        dog.makeSound();
    }

    如果需要调用牛的叫声方法:

    public void hearCowSound(Cow cow){
        cow.makeSound();
    }

    针对对象编程,每想调用不同子类对象的共有方法,都要去创建一个与该类相关的 hearSound() 方法,这样在 interface 中定义的共有方法便失去了意义。

  • 针对接口编程:

    public void hearSound(Animal animal) {
        animal.makeSound();
    }
原文地址:https://www.cnblogs.com/mtcnn/p/9421281.html