面向接口编程的小例子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向接口编程的小例子相关的知识,希望对你有一定的参考价值。


以前学习Java的时候,就听过面向接口编程,可惜当时水平太低不理解(当然,现在水平还是很低),现在学习了一点。接下来,我们通过一个小例子学习面向接口编程。

背景:假设每个单身狗都喜欢和蚊子玩,蚊子有一个唱歌的方法。代码如下:
  1. //Mosquito.java
  2. //蚊子类,拥有一个唱歌的方法
  3. package project.app.service;
  4. public class Mosquito {
  5. public String sing() {
  6. return "You have to admit that I sing songs very well.";
  7. }
  8. }


  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于蚊子类
  3. package project.app.service;
  4. import project.app.service.Mosquito;
  5. public class Single {
  6. private Mosquito mosquito;
  7. public void setMosquito(Mosquito mosquito) {
  8. this.mosquito = mosquito;
  9. }
  10. public void playWithMosquito() {
  11. System.out.println(mosquito.sing());
  12. }
  13. }
接下来,可以测试一下
  1. //Test.java
  2. package chris;
  3. import project.app.service.*;
  4. public class Test {
  5. public static void main(String[] args) throws Exception {
  6. Single single = new Single();
  7. Mosquito mosquito = new Mosquito();
  8. //设置single实例和mosquito实例的关系
  9. single.setMosquito(mosquito);
  10. single.playWithMosquito();
  11. }
  12. }
结果:
You have to admit that I sing songs very well.

如果之后单身狗和蚊子友谊的小船翻了,改成和蟑螂玩了,应该怎么改代码呢?一般的做法大概是这样。
增加蟑螂类。
  1. //Cockroach.java
  2. //蟑螂类,有不同于蚊子的唱歌的方法
  3. package project.app.service;
  4. public class Cockroach {
  5. public String sing() {
  6. return "I sing when everybody is in sleep.";
  7. }
  8. }
在单身狗类中,将有关蚊子的改成有关蟑螂的。
  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于蟑螂类
  3. package project.app.service;
  4. import project.app.service.Cockroach;
  5. public class Single {
  6. private Cockroach cockroach;
  7. public void setCockroach(Cockroach cockroach) {
  8. this.cockroach = cockroach;
  9. }
  10. public void playWithCockroach() {
  11. System.out.println(cockroach.sing());
  12. }
  13. }
可以测试一下。
  1. //Test.java
  2. package chris;
  3. import project.app.service.*;
  4. public class Test {
  5. public static void main(String[] args) throws Exception {
  6. Single single = new Single();
  7. Cockroach cockroach = new Cockroach();
  8. single.setCockroach(cockroach);
  9. single.playWithCockroach();
  10. }
  11. }
运行结果: I sing when everybody is in sleep.

经过上面的实践,我们发现,单身狗类依赖于蚊子类,导致蚊子类变化成蟑螂类时,单身狗类的代码必须跟着改变,这样类之间的耦合性太强了。我们想想,蚊子和蟑螂虽然唱着不同的歌,但是唱歌的方法却是相同的。为了代码能够降低耦合,我们可以使用接口,利用面向对象的多态性。可以将蚊子和蟑螂抽象一下,在概念上,往上升一级,比如宠物,动物,生物,物质。动物、生物和物质这几个接口就太宽了,也把单身狗包括进去了,那么,我们选择到宠物这一层。我们通过例子看一下。
  1. //Pet.java
  2. //宠物接口,有一个唱歌的方法
  3. package project.app.service;
  4. public interface Pet {
  5. public String sing();
  6. }
蚊子类实现宠物接口
  1. //Mosquito.java
  2. //
  3. package project.app.service.impl;
  4. import project.app.service.Pet;
  5. public class Mosquito implements Pet {
  6. public String sing() {
  7. return "You have to admit that I sing songs very well.";
  8. }
  9. }
  1. //Single.java
  2. //单身狗类,playWithMosquito依赖于Pet接口,注意,这个时候单身狗类只依赖于宠物接口,不依赖于具体的蚊子类了。
  3. package project.app.service;
  4. import project.app.service.Pet;
  5. public class Single {
  6. private Pet pet;
  7. public void setPet(Pet pet) {
  8. this.pet = pet;
  9. }
  10. public void playWithPet() {
  11. System.out.println(pet.sing());
  12. }
  13. }
  1. //Test.java
  2. package chris;
  3. import project.app.service.Single;
  4. import project.app.service.Pet;
  5. import project.app.service.impl.Mosquito;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. Single single = new Single();
  9. Mosquito mosquito = new Mosquito();
  10. single.setPet(mosquito);
  11. single.playWithPet();
  12. }
  13. }
如果我们改成和蟑螂玩,则修改代码时,增加蟑螂类的代码(也要实现宠物接口),单身狗类不用变(耦合性大大降低啊,节省了好多重复劳动)。
  1. //Cockroach.java
  2. //蟑螂类,有唱歌的方法
  3. package project.app.service.impl;
  4. import project.app.service.Pet;
  5. public class Cockroach implements Pet {
  6. public String sing() {
  7. return "I sing when everybody is in sleep.";
  8. }
  9. }

测试代码经过轻微的修改:

  1. //Test.java
  2. package chris;
  3. import project.app.service.Single;
  4. import project.app.service.Pet;
  5. import project.app.service.impl.Cockroach;
  6. public class Test {
  7. public static void main(String[] args) throws Exception {
  8. Single single = new Single();
  9. Cockroach cockroach = new Cockroach();
  10. single.setPet(cockroach);
  11. single.playWithPet();
  12. }
  13. }

上面的例子可以算是面向接口编程的一个例子。通过使用接口,利用面向对象的多态性,将蚊子类抽象成宠物接口,使单身狗类只依赖于抽象的宠物接口,大大降低了单身狗类对具体的蚊子类的依赖。这样,大大地方便了后期的扩展和维护,比如增加会唱歌的蟋蟀类等。







以上是关于面向接口编程的小例子的主要内容,如果未能解决你的问题,请参考以下文章

由java小例子到针对(面向)接口编程

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

面向接口编程和面向实现编程的区别

面向面试编程代码片段之GC

简单接口回调例子