如何理解java中的面向接口编程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iMouseWu
V2EX    Java

如何理解java中的面向接口编程

  •  
  •   iMouseWu 2013-12-01 21:25:27 +08:00 4859 次点击
    这是一个创建于 4401 天前的主题,其中的信息可能已经有所发展或是发生改变。
    个人觉得面向接口编程,主要是用到了多态,和虚方法的调用。
    然后听很多人解释就是,这样的好处1.解耦 2.抽象
    这两个很抽象,个人觉得
    一般人解释解耦都会说,如果这个接口的实现改变了,那么就不用去改依赖这个接口的类的代码了。
    但是我觉得你直接在这个类中New一个,如果你要改的话(保证方法不变),那么你也不需要去改动里面的代码呀。具体的应用场景在哪里,或者说如果不这么写的话,到时候会有什么问题。
    因为听起来确实可以体现解耦,但是细想一下,如果不这么写也没关系呀。
    所以能不能举几个例子,来提现下面向接口的好处。。。。
    9 条回复    1970-01-01 08:00:00 +08:00
    Mutoo
        1
    Mutoo  
       2013-12-01 22:04:15 +08:00   1
    如果你做小项目的话,写的代码都是自己用,体会不会很深的。
    但是如果你写的东西是给别人用的。很多人在用你的代码的时候,如果你一个小改动导致很多人的代码都不能用,得修改,你就知道面向接口编程的重要性了。
    bokix
        2
    bokix  
       2013-12-01 22:05:45 +08:00   2
    你现在住在一个最新式的高科技别墅里,所有一切都是自动化的,你的床头有一个按钮,按一下可以直接生产一杯拿铁咖啡,你只需要按一下按钮即可,别的什么都不需要做,不需要你选择水温,不需要你选择咖啡豆,不需要你指挥着去磨咖啡豆,仅仅按一下按钮即可。

    有一天你不想喝拿铁了,你想喝卡布奇诺,你不需要把你的墙挖开重新换一个按钮,你只需要打电话告诉咖啡供应商,把我的拿铁“实现”换成卡布奇诺的”实现”,然后你还是按下原来的按钮,出来的就是卡布奇诺了,或者你可以两种都保留,周1到周5是拿铁,周末是卡布奇诺,你可以告诉咖啡商,把你的咖啡实现以工厂模式管理:周1到周5是拿铁,周末是卡布奇诺,这样,你墙上的按钮还是原来那个,你还是不需要管咖啡豆、磨咖啡、冲泡等一些列流程,还是仅仅按下按钮,就能平时拿铁周末卡布奇诺了。

    这里的按钮就是接口,按钮背后,从咖啡豆-研磨-冲泡-到一杯成品咖啡出现在你面前,就是这个接口的具体实现,面向接口编程对你来说就是意味着你不需要在你想换咖啡口味的时候把你的墙敲开重新更换按钮,你也不需要关心按钮背后具体做了什么,你只关心最后呈现在你面前的咖啡,然后尽情的享用,enjoy your life!
    davepkxxx
        3
    davepkxxx  
       2013-12-01 22:12:57 +08:00   1
    在框架、工具包、大型项目中作用比较明显。
    Ricepig
        4
    Ricepig  
       2013-12-01 22:55:14 +08:00   1
    如果这个问题的背景是静态语言,那我举几个例子

    1. 如果使用接口,意味着你如果要引入新的接口的实现,旧有的代码“可能”不需要重新编译,可以在运行时(runtime)更新(切换)这个实现。如果刚好旧有代码使用了对象工厂,甚至IoC容器,则只需要改变配置文件就可以指定实现这个接口的类。
    2. 设想log4j,如果仅能够使用唯一的一个log目标(console,txt文件,数据库),那你用哪个new哪个就好,但是如果同时想用多个log目标呢?这个时候就可以说我有一个ILogger数组,对吗?
    3. 设想你在实现一个框架,而另一个程序员在实现其中的一个组件(算法),你是不是要事先和他商量(规定)他的组件怎么调用呢?如果不规定接口,那么,是你写一个空壳类给他,还是他把他的组件写好提交给你以后你再接下去工作?如果组件多了呢?

    如果这个问题的背景扩展到支持duck type的语言,则interface的作用,就在于“协议”--组件之间,严格规定程序员之间,如何协作。
    HarryZD
        5
    HarryZD  
       2013-12-02 00:10:29 +08:00   1
    po主可以这样想,如果没有接口没有抽象类改怎么设计一个系统。
    uleh
        6
    uleh  
       2013-12-02 13:11:06 +08:0
    配合工厂和接口,可以完全隔离开 API 和实现。不知道 lz 写过 JDBC 的程序没有。可以试想一下如果不是面向接口,你的程序就必须针对每一种数据库驱动实现。
    bsbgong
        7
    bsbgong  
       2013-12-02 15:42:27 +08:00   1
    简而言之:类与类之间要通信的时候,用接口!

    这就是面向接口编程,目的是类之间的通信,什么xx模式都是这样设计的。

    你可以自己想一下类与类通信的实现方法有哪几种,然后比较一下各自的优缺点,就知道是怎么回事了。
    bombless
        8
    bombless  
       2013-12-02 19:32:46 +08:00   1
    每个文件都有人负责的,不是你想改就改的……
    iMouseWu
        9
    iMouseWu  
    OP
       2013-12-03 19:05:47 +08:00
    @Mutoo
    @bombless
    @bsbgong
    @uleh
    @HarryZD
    @Ricepig
    @davepkxxx
    @bokix
    听了各位的分解,觉得确实很有道理,但是我想真正具体理解,对这个概念的理解也加深了很多好处到底在哪里,我想还需要我以后不断去实践。
    thx all
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2700 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 91ms UTC 08:45 PVG 16:45 LAX 00:45 JFK 03:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86