Java接口作为模块间通信的协议

  |  

摘要: 本文通过一个组装计算机的例子看一下 Java 接口作为模块之间通信协议的写法。

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


问题背景

在大型软件系统中,通常都是多人协作开发,将整个系统进行拆解,划分出子系统和模块,然后分工协作,不同的开发人员负责不同的模块开发。而模块之间如何调用,则可以通过接口来约定,也就是说,接口可以作为模块与模块之间通信的协议。

例子:模拟计算机组装

要组装一台计算机,我们需要主板、CPU、显卡、内存等配件,虽然这些配件是由不同厂家生产的,但这并不影响我们组装成一台计算机,我们只需要将这些配件插在主板的对应插槽中就可以了,因为主板生产商和其他配件生产商都会针对某个插槽定义的规范进行生产,而配件在主板上的这些插槽就类似于 Java 中的接口。

(1) 接口定义

定义两个接口 CPU 和 GraphicsCard,代表主板上的 CPU 和显卡接口。

  • CPU
1
2
3
4
5
package computer;

public interface CPU {
void calculate();
}
  • GPU
1
2
3
4
5
package computer;

public interface GraphicsCard {
void display();
}

通过接口通信的双方,必然有一方要实现接口,另一方通过接口来调用其实现。上面两个接口定义了 CPU 和显卡需要实现的方法。

(2) CPU 厂商根据接口提供实现

1
2
3
4
5
6
7
package computer;

public class IntelCPU implements CPU {
public void calculate() {
System.out.println("Intel CPU calculate.");
}
}

(3) GPU 厂商根据接口提供实现

1
2
3
4
5
6
7
package computer;

public class NVIDIACard implements GraphicsCard {
public void display() {
System.out.println("Display something.");
}
}

(4) 带 CPU 和 GPU 插槽的主板

主板类应该持有 CUP 和 GPU 接口的引用。Mainborad 类只是与 CPU 和 GraphicsCard 接口打交道,并没有依赖于具体的实现类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package computer;

public class MainBoard {
private CPU cpu;
private GraphicsCard gCard;

public void setCpu(CPU cpu) {
this.cpu = cpu;
}

public void setGraphicsCard(GraphicsCard gCard) {
this.gCard = gCard;
}

public void run() {
System.out.println("Starting computer...");
cpu.calculate();
gCard.displey();
}
}

两个私有的实例变量:cpu 和 gCard,类型分别是 CPU 和 GraphicsCard 接口类型。接口是不能直接实例化对象的,真实的 CPU 和 GraphicsCard 对象是通过 setCpu 和 setGraphicsCard 方法传递进来的。

在 Mainboard 类的 run 方法中,调用 CPU 接口和 GraphicsCard 接口的方法,完成计算机的启动与显示工作。

(5) 组装计算机

Computer 类的 main 方法创建了 CPU 和 GraphicsCard 的实现对象,并通过 setXxx 方法把 CPU 和显卡插到主板上,接着调用 Mainboard 类的 run 方法启动计算机运行。

1
2
3
4
5
6
7
8
9
10
package computer;

public class Computer {
public static void main(String[] args) {
Mainboard mv = new MainBoard();
mb.setCpu(new InterCPU());
mb.setGraphicsCard(new NVIDIACard());
mb.run();
}
}

Share