编程思想 面向接口编程

要面向接口编程,而不是面向实现编程。

一、接口

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. 设计与实现分离

使用面向接口编程还可以实现解耦,让设计与实现分离,只需要定义接口,不需要关心接口的实现,遵循共同的标准进行开发即可

参考