如何理解 Java接口(interface)

241 阅读4分钟

什么是接口?

接口更深层的理解是:使定义(规范和约束)和实现(具体的代码逻辑)分离,它是沟通(交互)的中介物(具体实现)的抽象化。

如何声明接口?

public inteface TV {

    // 开机
    public void open();
    
    // 关机
    public void close();
    
    // 选择频道
    public void selectChannel(Integer channel);
    
    // 设置声音大小
    public void setVolume(Integer vlume);
    
    ...
}

上面声明了电视机的接口(编程语言层面的接口),暴露4个方法(与外界交互的接口),通过阅读这些方法,你脑海里大致可以对这个电视机建模,并且知道这个电视机可以做些什么,这样大家就都达成了一个共识,电视机都会具有哪些功能了;而具体要怎么实现电视机的那些功能(开机、关机、选频道、设置声音大小)呢?这就交给不同的电视机厂商吧。

// 小米电视
public inteface MiTV extends TV {
    // 扩展玩游戏接口
    public void playGame(String gameId);
}

public class MiTVImpl implements MiTV {

    @Overide
    pubilc void open() {
        // TODO 小米对开机的实现
    }
    
    @Overide
    public void close() {
        // TODO 小米对关机的实现
    }
    
    @Overide
    public void selectChannel(Integer channel) {
        // TODO 小米对选择频道的实现
    }
    
    @Overide
    public void setVolume() {
        // TODO 小米对声音大小控制的实现
    }
    
    // 扩展玩游戏接口
    @Overide
    public void playGame(String gameId) {
        // TODO 对游戏的实现
    }
}

从上面的代码中可以知道,小米电视机不仅实现了电视机的基本操作,自身还扩展了玩游戏的接口,用户只需要通过选择小米电视提供的游戏,就可以玩游戏啦。

接口的作用?

接口即是设计:在设计层面,接口可以避免我们陷入对细节的过多思考,可以让我们站在一个更高的视角对系统做更好的评估,比如系统的交互设计是否合理,功能是否缺失,是否具备可行性,是否过于复杂等等。 接口即是约定:在编码层面,接口可以明确的告诉开发人员如何使用(接口的语义,需要什么作为输入,会有什么输出),而开发人员只需要根据这些约定去实现具体的功能代码即可。 统一类的共同行为:接口用来统一类的共通行为,当不同的类需要进行信息共享时,是不需要特别去创建类间的关系。举例来说,一个人(Human)及一只鹦鹉(Parrot)都会吹口哨(whistle),然而 Human 及 Parrot 不应该为 Whistler 的子类,最好的做法是令他们为 Animal 的子类,而他们可以使用 Whistler 的接口进行沟通。

接口就是一种设计思想

比如
LinkedList
ArrayList

都通实现了  
list 接口的
int size()

方法

什么时候可以考虑使用接口?

这虽然很难去定义(即使很多人一直使用面向接口编程),但个人还是根据自身的开发经验浅谈一下,如果说的不对,欢迎大家指教。

  • 当项目没有良好的开发规范、API文档还没出、项目紧,当项目组有不少新人多时,需要使用接口,而这个接口的定义应该由有经验、对业务和项目较为了解的人去定义,这样子就可以严格约定好接口的输入输出、接口命名、参数命名,而不会被乱来,而新人只需要写对应的实现就可以,这样子在重构的时候,不会导致由于各种奇奇怪怪的问题而去改接口,一旦改了接口,出问题的可能性会更大(这个坑踩过,痛过,特别是没有单元测试来做回归测试的时候)。
  • 当需要使用到策略模式的时候,应该基于接口来实现,比如不同国家的货币换算等。
  • 当框架功能对于系统基于接口设计的扩展非常友好时,应该使用接口,比如依赖注入,这个时候,接口可以使系统更具扩展性,更符合Open Close原则。
  • 基于SOA理念,暴露出来的服务必须是接口——阿里的Java开发规范手册里面就有严格说到这点。

什么时候可以不考虑使用接口?

  • 小项目,参与的人数较少时,时间紧,可以考虑不需要使用到接口,因为接口本身就不多,无需增加各种文档化的工作量。

参考: juejin.cn/post/684490…