前言
本文将通过一个案例,实现面向抽象编程与面向接口编程,在举例之前先简单说明下抽象与接口这两个概念。
1、面向抽象:抽象类的设计就是只关心操作,不关心具体实现,这样可以使得程序设计者在
将主要精力放在程序设计上,而不必拘泥于细节的实现。如人类分中国人、美国人、韩国人,他们都说早上好,设计者只需要设计一个speak()抽象方法,不用管具体哪国人说什么语言,他们具体说的语言给其他具体实现的程序员去做。抽象编程常常与继承、多态结合,面向抽象编程可以更适应需求变化,如我们又加一个日本人,使得代码可维护。
2、面向接口:接口中只有抽象方法,不像抽象类中可以有普通方法。接口只关心操作,而不关心具体实现细节,可以把主要精力放在程序设计上,内容细节由实现接口的类去完成。开发中比如我们开发一个登录功能,这时就可以用面向接口编程,不用管登录的具体细节,如实现登录时记录登录人数,只要定义loginEvent接口即可。
总结:面向抽象编程与面向接口编程都是将主要精力放在程序设计,而先不管具体实现细节。
案例
1、面向抽象编程
分析:
编写抽象类Animal就是只关注有两个行为,不关注具体实现,具体实现又其子类来实现,然后实现后只需要创建Simulator,往playSound方法中传入这个具体实现(猫或狗—多态)。
Animal.java
public abstract class Animal {
public abstract void cry();
public abstract String getAnimalName();
}
Simulator.java
public class Simulator {
public void playSound(Animal animal){
System.out.print(animal.getAnimalName()+":");
animal.cry();
}
}
Cat.java
public class Cat extends Animal {
@Override
public void cry() {
System.out.println("喵喵喵");
}
@Override
public String getAnimalName() {
return "猫";
}
}
Dog.java
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("汪汪汪");
}
@Override
public String getAnimalName() {
return "狗";
}
}
Application.java
public class Application {
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.playSound(new Cat());
simulator.playSound(new Dog());
}
}
输出
2、面向接口编程
分析
同样的案例,只是这里是接口
设计一个动物声音“模拟器”,希望可以模仿许多动物的叫声(cry),要求如下:
-
编写接口Animal
Animal接口有两个抽象方法cry()和getAnimalName(),既要求给出各种动物叫声与名称 -
编程模拟器Simulator
该类有一个playSound(Animal animal)方法,参数类型是Animal -
编写Animal接口的Dog类与Cat类
-
主类:Application
实现代码:
Animal.java
public interface Animal {
public void cry();
public String getAnimalName();
}
Simulator.java
public class Simulator {
public void playSound(Animal animal){
System.out.print(animal.getAnimalName()+":");
animal.cry();
}
}
Cat.java
public class Cat implements Animal{
@Override
public void cry() {
System.out.println("喵喵喵");
}
@Override
public String getAnimalName() {
return "猫";
}
}
Dog.java
public class Dog implements Animal {
@Override
public void cry() {
System.out.println("汪汪汪");
}
@Override
public String getAnimalName() {
return "狗";
}
}
Application.java
public class Application{
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.playSound(new Cat());
simulator.playSound(new Dog());
}
}
输出
That’s all !