要面向接口编程,而不是面向实现编程。
一、接口
Java 面向对象 - 接口
二、面向接口编程
在设计一个软件的代码架构时,事先约定各个功能的接口。
在实际开发时,事先接口,从而完成具体的功能。
后续,通过重写接口的实现,达到维护和扩展的目的。
三、可扩展性和可维护性
1. 面向实现编程
假设有这么一段代码:
相同代码重复书写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Bicycle { public void drive() { System.out.println("骑自行车"); } }
public class Tricycle { public void drive() { System.out.println("开三轮车"); } }
public class Driver { public void drive(Bicycle bicycle) { bicycle.drive(); }
public void drive(Tricycle tricycle) { tricycle.drive(); } }
|
增加一个需求,开汽车:
可扩展性差,每增加一个新的需求,就需要增加一个新的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Bicycle { public void drive() { System.out.println("骑自行车"); } }
public class Tricycle { public void drive() { System.out.println("开三轮车"); } }
public class Car { public void drive() { System.out.println("开汽车"); } }
public class Driver { public void drive(Bicycle bicycle) { bicycle.drive(); }
public void drive(Tricycle tricycle) { tricycle.drive(); } public void drive(Car car) { tricycle.drive(); } }
|
维护,要求改为调用两次 drive()
方法:
可维护性差,维护时需要重复修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public class Bicycle { public void drive() { System.out.println("骑自行车"); } }
public class Tricycle { public void drive() { System.out.println("开三轮车"); } }
public class Car { public void drive() { System.out.println("开汽车"); } }
public class Driver { public void drive(Bicycle bicycle) { bicycle.drive(); bicycle.drive(); }
public void drive(Tricycle tricycle) { tricycle.drive(); tricycle.drive(); } public void drive(Car car) { tricycle.drive(); tricycle.drive(); } }
|
2. 面向接口编程
假设有这么一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Vehicle { void drive() { } }
public class Bicycle extends Vehicle { @Override public void drive() { System.out.println("骑自行车"); } }
public class Tricycle extends Vehicle { @Override public void drive() { System.out.println("开三轮车"); } }
public class Driver { public void drive(Vehicle vehicle) { vehicle.drive(); } }
|
增加一个需求,开汽车:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Vehicle { void drive() { } }
public class Bicycle extends Vehicle { @Override public void drive() { System.out.println("骑自行车"); } }
public class Tricycle extends Vehicle { @Override public void drive() { System.out.println("开三轮车"); } }
public class Car extends Vehicle { @Override public void drive() { System.out.println("开汽车"); } }
public class Driver { public void drive(Vehicle vehicle) { vehicle.drive(); } }
|
维护,要求改为调用两次 drive()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Vehicle { void drive() { } }
public class Bicycle extends Vehicle { @Override public void drive() { System.out.println("骑自行车"); } }
public class Tricycle extends Vehicle { @Override public void drive() { System.out.println("开三轮车"); } }
public class Car extends Vehicle { @Override public void drive() { System.out.println("开汽车"); } }
public class Driver { public void drive(Vehicle vehicle) { vehicle.drive(); vehicle.drive(); } }
|
这样的代码具有更好的可扩展性和可维护性。
四、设计与实现分离
1. 接口与实现
- 接口:对方法的定义(规范与约束)
- 实现:方法的具体实现
2. 设计与实现分离
使用面向接口编程还可以实现解耦,让设计与实现分离,只需要定义接口,不需要关心接口的实现,遵循共同的标准进行开发即可
参考