精华内容
下载资源
问答
  • 今天有个同事问我,如何理解接口,刚好中午下班要去吃饭,边走边说,但是都没有说到重点,所以想通过这篇文章来分享一下自己对接口的理解,阅读需要2分钟。 什么是接口? 对象通过它们公开的方法来定义它们与外界的...

    目录结构

    • 前言
    • 什么是接口?
    • 如何声明接口?
    • 接口的作用?
    • 什么时候可以考虑使用接口?
    • 什么时候可以不考虑使用接口?
    • 在线接口文档化平台
    • 总结

    前言

    今天有个同事问我,如何理解接口,刚好中午下班要去吃饭,边走边说,但是都没有说到重点,所以想通过这篇文章来分享一下自己对接口的理解,阅读需要2分钟。

    什么是接口?

    对象通过它们公开的方法来定义它们与外界的交互行为,而方法就形成了与外界交互的接口。例如电视机的开关按钮就是你与塑料外壳另一侧的电线之间的接口,你只要按下电源开关这个按钮,就可以控制电视机开机和关机,而你不需要关注电视机开机和关机的细节,接口就是让你知道它在做什么,而无需知道它们怎么做;接口更深层的理解是:使定义(规范和约束)和实现(具体的代码逻辑)分离,它是沟通(交互)的中介物(具体实现)的抽象化

    如何声明接口?

    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 对游戏的实现
        }
    }
    复制代码

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

    接口的作用?

    1. 接口即是设计:在设计层面,接口可以避免我们陷入对细节的过多思考,可以让我们站在一个更高的视角对系统做更好的评估,比如系统的交互设计是否合理,功能是否缺失,是否具备可行性,是否过于复杂等等。
    2. 接口即是约定:在编码层面,接口可以明确的告诉开发人员如何使用(接口的语义,需要什么作为输入,会有什么输出),而开发人员只需要根据这些约定去实现具体的功能代码即可。
    3. 统一类的共同行为:接口用来统一类的共通行为,当不同的类需要进行信息共享时,是不需要特别去创建类间的关系。举例来说,一个人(Human)及一只鹦鹉(Parrot)都会吹口哨(whistle),然而 Human 及 Parrot 不应该为 Whistler 的子类,最好的做法是令他们为 Animal 的子类,而他们可以使用 Whistler 的接口进行沟通。
    // 吹口哨
    public inteface Whistler {
        /**
         * 吹口哨
         */
        public void whistle();
    }
    
    public class JuniorWhistler implements Whistler {
        public void whistle() {
            System.out.println("入门级口哨声");
        }
    }
    
    public class SeniorWhistler implements Whistler {
        public void whistle() {
            System.out.println("高级口哨声");
        }
    }
    
    // 定义动物接口
    public inteface Animal {
        /**
         * 吹口哨
         *
         * @param whistle
         * @return
         */
        public void whistle(Whistler whistle);
    }
    
    public class Human implements Animal {
        
        public void whistle(Whistler whistle) {
            whistle.whistle();
        }
        ...
    }
    
    public class Parrot implements Animal {
    
        public void whistle(Whistler whistle) {
            whistle.whistle();
        }
        ...
    }
    
    public class Demo {
        public static void main(String[] args) {
            // 人吹口哨
            Human human = new Human();
            human.whistle(new JuniorWhistler());  // 入门级口哨声
            
            // 鹦鹉口哨
            Human human = new Human();
            human.whistle(new SeniorWhistler()); // 高级口哨声
        }
    }
    复制代码
    1. 使用时无需知道实现类:当接口有实现类时,在使用它的时候无需知道它的实现类是什么(感兴趣的可以了解一下多态依赖注入)。例如,一个事物因为口哨的噪音影响到其他人,对于其他人而言,就不需要知道噪音来源是来自人还是鹦鹉,因为他们可以确定,一个会吹口哨的事物正在吹口哨。举一个更实际的例子,排序算法可能会期待对象的类型是可以被比較的,于是它只需要知道对象的类型可以被以某种方式进行排序即可,这与对象的类型无关。whistler.whistle() 将会调用对象的实现方法 whistle,而不需要知道对象是以哪个类来实现 Whistler。
    public inteface Whistler {
        public void whistle();
    }
    
    public class Human implements Animal {
        
        public void whistle(Whistler whistle) {
            whistle.whistle();
        }
        ...
    }
    复制代码

    Human 类中的 whistle() 方法的实现 whistle.whistle() 不需要知道口哨具体的实现类是哪个,而 whistle(Whistler whistle)方法 只关注入参是 Whistler 类型就行。 至于 Java 如何实现动态绑定到具体的实现类上的方法,这个之后另开一篇文章来写。

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

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

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

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

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

    在线接口文档化平台

    推荐的一些在线API管理平台 Swagger Editoreolinker

    • swagger 偏向开发人员,需要掌握编写swagger文档的一些语法,上手稍慢,但界面好看,功能也强大。
    • eolinker 全部都是图形化,上手快,功能够用。

    总结

    本文通过一些例子和个人的开发经验,从接口的定义、接口的声明、再到接口的适用场景,来与读者分享本人对接口的理解,希望可以给读者一些收获,如果发现本人有理解不对的地方,或者有需要补充的地方,欢迎评论交流。

    展开全文
  • 如何理解接口隔离原则?

    千次阅读 2017-02-08 11:11:39
    接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 (图片来自网络) 见上图,该把接口细分到3个接口中去,保证每个类都只实现它需要的接口接口隔离原则与单一...

    接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

    (图片来自网络)

    见上图,该把接口细分到3个接口中去,保证每个类都只实现它需要的接口。

    接口隔离原则与单一职责原则有什么区别呢?

    单一职责原则,是指一个类只应该响应一个变化。比如一个赛马的程序,需要两个功能一是记每匹马跑的圈数,另一个是计算谁是对每匹马计算最终得分。 这两个功能有一点的联系,但是外部调用有可能只需要统计每匹马跑的圈数。所以要把这两个功能写到一个类里面。否则违反了单一职责原来。


    是不是符合单一职责原理的类就只使用一个接口呢?这不一定。或许响应一个变化,需要使用多个单一的接口。 所以这两个原则是在不同层面上,分别保证类和接口只负责一项单独的任务。


    SOLID 五项原则介绍

     如何理解单一职责原则?

     如何理解接口隔离原则?

     如何理解开放封闭原则?

     如何理解里氏替换原则?

     如何理解依赖倒置原则?


    展开全文
  • 接口就是个招牌。 比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了, 突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。 KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿...

    接口就是个招牌。

    比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了, 突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。

    KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。

    那么为神马我们要去定义一个接口呢,这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC

    的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。

    要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射).很显然,这样一家家的问实在是非常麻烦(发射性能很差)。

    要么,我们就要记住,中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,

    我们也不可能知道(不利于扩展).

    展开全文
  • Java如何理解接口,写得好!

    万次阅读 2010-10-28 09:14:00
     接口的作用其实是提供你 在不改动原有代码的基础上 增加、改变类的功能。那么为什么在设计模式里应用广泛呢?因为在面向对象的设计原则中有那么一条开放封闭原则,内容大致如下:一个良好的设计应该可以在...

        接口的作用其实是提供你 在不改动原有代码的基础上 增加、改变类的功能。那么为什么在设计模式里应用广泛呢?因为在面向对象的设计原则中有那么一条开放封闭原则,内容大致如下:一个良好的设计应该可以在不改动原有代码或者改动少数代码的基础上增加或者改变原有的功能。因此接口正好符合这一需求。接下来看一下代码实例你就会明白。以下代码是模仿JDBC的设计原则所写的,并不是原代码,但是设计思想是一致的,之所以选择这样一个例子是因为你可以对接口的应用有一个感性的认识 

    假设read()方法从数据库里读取一个数据。由于不同数据库的读数据的实现方法各有不同,因此Java如何统一这一差异呢? 

    interface readData 

    object read(); 


    好,SunJDBC里读取数据的接口定义成这样。那么厂商A在自己产品的JDBC驱动里这样实现: 

    class dbReader implements readData 

    public object read() 

    //
    与厂商A数据库相关的读取操作实现 



    好了,那么你在你的程序里使用了厂商A的数据库,因此你要用他的JDBC驱动来写程序: 

    class dbProgram 

    //
    加载驱动 
    //
    调用相应的JDBC方法取得connection等必要对象 
    object readData=read();//
    这里的read()方法在JDBC的接口中定义过 


    至此,你完成了对于数据库的读取。到此为止一切顺利。 

    一天,你的程序由于种种原因要使用厂商B的数据库驱动了(也许是你的客户要求这么做,也许是厂商A倒闭了,他的数据库再也不是主流了)。那么你很幸运,因为你使用Java,你使用JDBC访问数据库。你的代码会如何改动呢?通常如果你的数据库变动的话会造成对代码的巨大变动,但是现在,使用JDBC(注意JDBC是一套接口规范)的话,你只要改变你加载的JDBC驱动就可以了,以下的代码一律不用更改。为什么呢?因为厂商AB的驱动都符合JDBC规范是吧?因此都实现了readData接口中的read()这个方法对吗?这样虽然你更换了数据库,但是你的程序其实是调用了对应数据库的read()方法,因此你可以不改变读取代码而只是更改要加载的数据库驱动就可以。那么Java又是如何实现动态的调用呢?面向对象的程序中可以这样引用一个实现了某个接口的类的实例:readData rd=new dbReader();//接口名称 变量名=new 实现了接口的类的名称() 

    调用接口中的方法就可以这样,rd.read() 

    可以看到,在代码中始终可以用接口类型的变量来引用具体实现他的类。这样的好处是不管类的具体实现怎么变,由于他必须实现接口中定义的方法,所以我们始终可以保证用readData接口类型的变量能够调用到具体实现这个接口的类的read()方法。 

    上面的例子由于是自己乱编的所以我在以实际的JDBC应用来举个例,希望大家能够彻底的弄懂。 
    import java.sql.*; 
    public class first{ 
    public static void main(String args[]) 

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    URL url=" jdbc:odbc:tic "; 
    Connection db=DriverManager.getConnection(url,"fisher","yht8125"); 
    Statement sq_stmt=db.createStatement(); 
    String sql_str="select * from tic"; 
    ResultSet rs=sq_stmt.executeQuery(sql_str); 
    }

    展开全文
  • 以一个Door的为例,该Door具有执行两个动作 Open 和Close 此时可以用接口和抽象类两种方法来定义 --------- abstract class Door{  abstract void open();  abstract void close()...
  • 如何理解java 接口

    2013-07-23 12:59:56
    面试的时候被问到如何理解java接口,不知道该怎么回答了,以前也没考虑过这个问题,请问您是如何理解java 中的 接口(interface)的呢?
  • 如何理解java的接口

    千次阅读 2018-08-05 01:28:06
    1.接口 生活中的接口含义: 接口是一种公共的交互规则 Java中的接口 是Java语言中一种引用类型,主要封装了方法 格式 : interface public interface 接口名称 { 1. 抽象方法 (JDK 7之前) 2. 默认方法(JDK 8)...
  • 许多东西还不是很理解。其中接口是最让我感到困惑的一个概念。 如果说类可以轻松的通过构造方法和类方法在Main中设定各种属性以及各种不同的功能的话,接口似乎就更偏向单纯的提供方法结构了。 <p><strong>...
  • 什么是接口 接口是组件之间的协议,描述了组件对外提供的服务。从技术上讲接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。接口可以从父接口中继承。接口的继承首先是...
  • 我觉得吧,很多文章接口回调太麻烦写的。 我们用接口回调的目的是什么? A咨询B一个问题,B无法立刻知道答案,所以B说我处理完后立刻回复你,然后A就不用傻等着了。 所以在B类中,我们需要设置监听: 1、设置...
  •  不卖关子,我个人对这两个的理解:  类是具体实例的抽象,比如一个json字符串的抽象;而抽象类是类的抽象;接口是抽象类的抽象,接口更像是一种协议  听我慢慢道来~  吐槽  首先,我必须吐槽一下这种面试...
  • https://www.cnblogs.com/zhangweizhong/p/9526331.html Golang 入门系列(四)如何理解interface接口
  • 幂等,这个词来源自数学领域。幂等性衍生到软件工程中,它的语义是指:函数/接口可以使用相同的参数重复执行, 不应该影响系统状态,也不会对系统造成改变。举一个简单的例子:正常设计的查询接口,不...
  • 对于go语言中interface接口理解,有一个疑问:既然接口只保存了函数,那么他到底有没有操作实际对象呢?如果操作的话,是怎么操作实际对象的? 答案:是。怎么操作的,请看一层一层的解释。 1,假设有一个结构体...
  • 0. 前言在我自己早期学习编程的时候,对接口存在的意义实在困惑,我自己乱写代码的时候基本上不可能意识到需要去写接口,不知道接口到底有什么用,为什么要定义接口,感觉定义接口只是 提前做了个多...
  • 如何理解 Golang 中的接口。个人认为,要理解 Go 的接口,一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型? 鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力。游泳起来像...
  • 如何理解“面向接口的编程”

    千次阅读 2016-07-22 23:03:39
    经常听说“面向接口编程”,但并不是特别的理解。什么时候应该面向接口编程? 当我一开始接触暴露出的接口的时候,我很困惑,并不知道为什么需要他们。如果我们使用Java或者c#,我们已经有了继承这个概念,我一开始...
  • 如何理解接口隔离原则”? 接口隔离原则的英文翻译是“ Interface Segregation Principle”,缩写为 ISP。Robert Martin 在 SOLID 原则中是这样定义它的:“Clients should not be forced to depend upon ...
  • 应该是升序排列,这里却是降序排列的,怎么理解?? A:compare函数的机制是自定义下若o1>o2则返回1,而上面的代码中若1会返回1,即在上面的自定义下,其实1是大于2的(即compare(1,2)=1),同理,2也会大于3....
  • 一般我们代码中为了实现多态,方便重构我们都会在写类属性的过程中写如下代码: ...接口在我们最初接触java的时候所有的资料都写着接口不是一个类,且不能有方法实体。那他为什么会被整成一个属性类型摆在这里呢?...
  • 1.什么是接口测试,你是如何理解的? 答: 接口测试原理 根据 参数 协议 调用方法 code含义 返回数据的意义 等规范进行 模拟请求,向接口发送数据(报文),再获取结果(响应),依据响应结果进行断言 接口测试的流程: ...
  • 如何理解以太坊ABI - 应用程序二进制接口 最新内容会更新在主站深入浅出区块链社区原文链接:如何理解以太坊ABI - 应用程序二进制接口 很多同学不是很明白以太坊ABI是什么,他的作用是什么,读完本文就明白了...
  • 在Java中多态理解起来挺费劲的,通过例子来说明可以帮助更好的理解。以下代码通过售卖汽车的例子讲解。 //汽车接口 interface Car{ //要求 接口中有:汽车名称和售价 String getName(); int getPrice(); } ...
  • 如何理解java.io.Serializable接口

    千次阅读 2017-10-08 21:10:27
    java.io.Serializable是一个没有任何待实现方法的接口,此接口在对象序列化的过程中起到了什么作用?或者此接口在java序列化机制中扮演什么角色? Java平台允许我们在内存中创建可复用的Java对象,但一般情况下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,018
精华内容 2,407
关键字:

如何理解接口