`
lonelybug
  • 浏览: 12001 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

解释一下,为什么需要接口而不直接实现类。

阅读更多
看了这里的一些帖子和很多地方的帖子,很多人都在问为什么非要interface或者abstract class,然后还要在写一个实现类,而其实,我就市要做一个很简单的功能!?

对,如果你制作一个简单的功能,我同意你可以直接使用spring hibernate等框架来写,他们本身的好处也是干这个的。

但是,中国人有句老话,叫做杞人忧天,很多的时候,你有没有内心问自己,这个系统,我设计的,如果老板要改动,我可以在很短的时间内做到改变么?

当你问自己这个问题的时候,你就已经把直接写实现类的做法怀疑了。

面向接口的原则,不是只出现在程序员或者说IT界,接口设计是人类对一个问题或者一个物体的概括理解能力的表现。我们日常生活中处处有接口。

在我作一个简单的说明之前,我要补充以下,系统框架中,除了层的概念,还有一个叫做boundary,每一个layer(层)是由不同的boundary(box)组成。

举例一二三,比如,简单的说,发电厂就是实现类(implementation class),每个发电厂都是独立的boundary,而发电厂就是统称为一个layer,也许还不明白,比如,我们平时说,发电厂,没人关心你家的电来自于那个发电厂,而关心的是你家的插座有没有电,所以三项插座,二项插座至十发电厂给用户的最终接口。发电厂之间也是通过一个特殊的工业接口来互相访问,所以,这也是为什么说,有时候有的发电厂在夏天负担过重,就可以把负担分给其他的电场供应。反过来,如果让老百姓天天关心的是发电厂,而不是插座,那你觉得这样的城市电力设计是不是很糟糕呢?

在举个例子,比如果.....,嗯,好,就说汽车,汽车都见过吧,四个轮子,一个方向盘,但是,你们有没有发现,有时候你们的汽车上面的音响系统坏掉或者要升级的时候,只需要取下中间面板上面的那个独立的音响播放器,然后买一个新的,由汽车维修给你们撞上就可以了,不管是飞利浦,boss还是简单的radio的和卡带的,你们从来不会在买一个汽车音响的时候关心他能不能安在汽车上,而是可以完全关心颜色,款式,品牌这些问题上,如果,反过来设计,每一个汽车品牌都直接实现自己的独立设计,不遵循工业接口,那你觉得这样的汽车音响会有很多选择么?

最后在举一个我们每天息息相关的例子,门,每天人们通过不同的门,进入或者走出不同的地方,而门就是那个地方或者建筑物的接口,如果说,我们反过来,每个大厦或者建筑物都直接应用自己喜欢的实现进出的方式,那你们觉得每天的生活会不会有点太麻烦?

我举例子只是来简单的解释一下,接口不是一个繁琐的过程,而是每个工业,甚至是每天生活中,我们必须应用到的东西,所以,如果看待现在的文明社会用程序员的方式的话,那么就是一种接口世界,现实生活中很多人叫做标准或者协议,由看得见摸得找的,也有看不见摸不着的接口。

很多人可能想对我举的例子进行进一步的反驳,其实没有必要,如果你要跟我探讨每一个例子来映射程序中的接口问题,那就是在抬杠,抬杠很浪费时间,所以,我不会跟你探讨例子的问题,那就是个例子,而这个例子是每天确实发生的,使用的。

希望能解释明白一点在程序设计中接口编程的优势所在。
分享到:
评论
21 楼 liusong1111 2008-10-06  
对照着看吧。
不管是不是满意,有没有理解,选择java您都得受着,这注定是个不了了之的话题。
http://www.iteye.com/topic/231139
20 楼 ThinkingInAll 2008-10-06  
看接口比看实现类清晰

过多的接口也没有必要,DAO这一层我已经从很多接口简化到只有一个类了

没必要的东西写多了就是傻
19 楼 southgate 2008-10-06  
在我的开发经历里 接口多数用的都很多余
一个接口一个实现类 何苦 吃饱了
18 楼 tinyyea 2008-10-06  
jfheng 写道
实现接口 针对接口开发的所有 逻辑层代码 不需要重写

你不针对接口一样可以达到代码复用,逻辑层代码一样可以不改,我只要重写那些需要重写的类保留原有的类名和包名然后替换一下就行了。

e_sky 写道
一切从实际出发.
不过对于大项目,面向接口编程的好处显而易见.

这说得和没说一样,好处在哪里呢?能分享一下么?

如果开发类库使用接口偏重于接口的多态性,
但web开发中我看80%的接口的确也都没什么用,因为一切除了代码以外软件资源都在需求和设计文档里定死了,你很少要切换什么实现甚至没有切换实现,哪怕有直接把原来的干掉重写。
我看接口确实也就是个约定, 约定在文档中,约定在Team之间,约定在搭档之间,以至于双方实现的东西能直接拿来用。
17 楼 e_sky 2008-10-06  
一切从实际出发.
不过对于大项目,面向接口编程的好处显而易见.

16 楼 bloodrate 2008-10-06  
只有通过统一建模,明确地分析和抽象,细致的研讨之后的接口(比如java source中那些接口,我估计没一个定义个接口中的没一个方法都是大家在讨论中反复研讨才得出的结论),接口才能发挥出威力,否则自己随着需要随手写的接口可能用处不明显。
15 楼 qiyongqiang 2008-10-06  
接口其实更多的用于抽象和规约
比如协同工作期间,订立接口有助于双方相互间调用的规范。
同时也有助于自顶向下的思考。
在内部实现中,接口实现多态也有不少用处,不过也不是每一个地方都要用。
实现好了,需要的时候简单重构一下,就能获得接口的相关特性。
14 楼 calmness 2008-10-06  
axeon 写道
嘿嘿,各位息怒。

我搞java开发的时候,你们还不知道在哪里呢?

业务逻辑的复杂是一回事儿,技术实现的复杂是另外一回事儿。
如果业务本来就足够复杂了,再加上复杂的技术实现,等于复杂*复杂,会做的更好?

再说了,一个接口会包含多个实现么?我想大部分时候一个接口都只有一个实现类吧?
复杂业务逻辑就必须搞个接口,证明自己?

为什么你们听到我的话会跳起来?
从心理上说,你们实在无法接受把复杂问题简单化处理,这样做技术太没面子了!都不好意思跟人打招呼,只是你们的思维惯势。
从技术上说,你们也就搞过java,技术的积淀浅薄。就连spring的这些好处,也都是别人吹给你听的!你们根本就不能真正明白spring为什么这么做,利弊都在哪里。你们跳不出java的圈子,所以根本就不能真正理解java。

知道么?
心理素质差+技术水平次,就是你们做出如此反应的根本原因。

实在抱歉啊!


呵呵,用资历来砸人可不是明智的做法。

其实在很多时候,我们总是在为一些未来可能根本不存在的需求而买单,很多人在谈论一些设计问题上的时候总是在说什么为了未来的扩展性、可维护性什么的,把系统搞得是超级复杂,一个简单的功能实现得庞大无比,然而事实上,我们的系统真会有这样的需求么?未雨绸缪?但也不可太过吧?

有时候回想一下,很多一些以前考虑的事情,实际上根本从来就没有发生过,但就是因为这些从未发生过的需求,让我们浪费了不知道多少时间,我们是否应该在未来可能性的需求以及当前开发成本两者之间做一个正确的选择?
13 楼 miaomiao0307 2008-10-06  
和项目大小有关,如果小项目就得不偿失了
12 楼 jacky2007 2008-10-06  
很多时候定义接口的跟写实现类的并非同一人....
11 楼 sunarrow 2008-10-06  
赞同liusong1111!!
接口其实更多的用于抽象和规约,作为一种协议或是约定是很有用的。

在其它时候用接口大部分是在浪费代码。。
DAO只写一个实现类,又为什么要用接口呢?这话说得很对!!
10 楼 axeon 2008-10-06  
嘿嘿,各位息怒。

我搞java开发的时候,你们还不知道在哪里呢?

业务逻辑的复杂是一回事儿,技术实现的复杂是另外一回事儿。
如果业务本来就足够复杂了,再加上复杂的技术实现,等于复杂*复杂,会做的更好?

再说了,一个接口会包含多个实现么?我想大部分时候一个接口都只有一个实现类吧?
复杂业务逻辑就必须搞个接口,证明自己?

为什么你们听到我的话会跳起来?
从心理上说,你们实在无法接受把复杂问题简单化处理,这样做技术太没面子了!都不好意思跟人打招呼,只是你们的思维惯势。
从技术上说,你们也就搞过java,技术的积淀浅薄。就连spring的这些好处,也都是别人吹给你听的!你们根本就不能真正明白spring为什么这么做,利弊都在哪里。你们跳不出java的圈子,所以根本就不能真正理解java。

知道么?
心理素质差+技术水平次,就是你们做出如此反应的根本原因。

实在抱歉啊!
9 楼 liusong1111 2008-10-06  
从概念的角度,"接口其实更多的用于抽象和规约",这句话十分正确。
从实现的角度,java的interface重点在于辅助静态实体的建模,即楼主说的汽车、发电厂,用"接口"去描述它抽象的组成部分和行为协作。
然而,如果用它“变相”的去做执行流程的建模,就太笨了。这时,应该在函数签名上做文章,请参考C#是怎么做的。
如果用实体建模的优势去掩盖流程建模的劣势,不是掩耳盗铃吗?对于web开发,那些DAO只写一个实现类,又为什么要用接口呢?除了前面的理由,跟底层的支持不足也有关。

"复杂逻辑"和"没有逻辑"是不一样的,看来某些人自己就不讲逻辑。
8 楼 Ethan 2008-10-06  
axeon 写道
除非是逻辑复杂的应用,否则都不需要搞一个接口什么的。
试问,现在80%的web应用中,有几个真的有非要接口不行的?

如同spring的依赖注入,学术价值远高于实用价值。

java本身是不错的,就是因为这些劳什子不实用的玩意,被搞的一团糟。


楼上的这位可能对Spring是个啥还没弄清楚就在这里胡邹了!所谓的逻辑何来复杂?何来简单?我看是你从根本上没有一个对于设计以及java编程的深刻认识,才会发表这样的言论。只要是严格按照设计的思路按照面向对象的概念来写东西,不用想一定是按照接口编程的思想来实现。
顺便再踩一脚,假如你所经历的应用都按照你的思路开发的话,两个字:垃圾!
7 楼 寻找出路的苍蝇 2008-10-06  
ls的ls,你做过web应用?你用过spring?
6 楼 抛出异常的爱 2008-10-06  
啊,原来作web应用是没有逻辑的.....那写软件干什么?
5 楼 axeon 2008-10-06  
除非是逻辑复杂的应用,否则都不需要搞一个接口什么的。
试问,现在80%的web应用中,有几个真的有非要接口不行的?

如同spring的依赖注入,学术价值远高于实用价值。

java本身是不错的,就是因为这些劳什子不实用的玩意,被搞的一团糟。
4 楼 JavaTestJava 2008-10-06  
除非只写一个功能的类。否则都有写接口的必要。
3 楼 WhisperXD 2008-10-02  
接口其实更多的用于抽象和规约
比如协同工作期间,订立接口有助于双方相互间调用的规范。
同时也有助于自顶向下的思考。
在内部实现中,接口实现多态也有不少用处,不过也不是每一个地方都要用。
实现好了,需要的时候简单重构一下,就能获得接口的相关特性。
2 楼 zhu_chen001 2008-10-02  
接口是定义行为,抽象类是实现公共行为的,具体类是实现具体行为的

相关推荐

    调用接口怎么知道使用的是哪个实现类.doc

    调用接口怎么知道使用的是哪个实现类 Java通过接口调用方法的时候,怎么知道调用的是哪个实现类 当调用接口中的方法时,如何判定用的是哪个实现类 一个接口有多个实现类,怎么知道调用了哪个实现类

    面向接口编程而不是面向实现编程

    4. **使用接口**:在需要的地方,我们使用实现了接口的对象,而不是直接创建实现类的实例。这样,我们的代码对具体实现保持无知,增强了灵活性。 5. **配置和管理**:在应用的配置中,我们可以指定哪些实现类应该被...

    Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    - 当通过接口引用调用方法时,该方法必须在接口中已经声明,并且在实现类中的实现必须与接口中定义的完全一致。 - 子类可以重写父类的方法,但这并不意味着父类引用不能调用子类的其他方法。如果子类有特有的方法,...

    实现接口的匿名类

    4. **匿名类实现接口**:在创建对象时直接实现接口,不需要声明单独的类,常用于内部类和回调函数。 5. **方法调用**:通过接口引用调用方法,实际执行的是实现该接口的具体类的对象的方法。 理解这些概念对于深入...

    net 接口实现,接口定义,接口和类,接口,类

    接口的使用使得代码更加灵活,易于扩展,同时也支持多继承,这是类无法直接实现的。本文将深入探讨.NET中的接口实现、接口定义、接口与类的关系,以及接口与类的区别。 ### 接口定义 接口通过`interface`关键字...

    5. 多个service实现同一个接口 或者抽象类 1

    这两个实现类都使用了Spring的`@Service`注解,标记为Spring管理的bean。`@Service`注解通常用于表示业务层的服务类。在这里,它们分别注入了不同类型的`OAXmlDealHandle`实现,通过`@Resource`注解来指定类型,分别...

    Java 接口和抽象类

    然后,我们创建了两个具体实现类:Human 和 Monkey,它们都继承了 LivingThing 抽象类。在 Human 和 Monkey 中,我们实现了抽象方法 dance(String dancingStyle)。 接口 接口是一种特殊的抽象类,它不能被实例化,...

    DLL导出类的三种方法,导出接口类,导出类指针,导出类,不建议使用导出类

    本篇将详细讲解DLL导出类的三种常见方法:导出接口类、导出类指针以及导出类,并说明为什么通常不建议直接导出类。 1. 导出接口类 接口类(Interface Class)是一种只包含纯虚函数的抽象基类,不包含任何数据成员...

    匿名内部类实现接口回调

    匿名内部类是Java中的一种特殊类,它没有名称,可以直接实例化,并且可以继承一个类或实现一个(多个)接口。在接口回调的场景下,我们可以使用匿名内部类快速地创建一个实现了接口的实例,而无需定义一个新的类。...

    UML类图中的接口与接口实现

    如果属性不是公共的,则实现接口的分类器不需要显式定义这些属性,只需要保证其实现符合接口的要求即可。 2. **定义关联**:当接口定义了一个关联时,所有实现该接口的分类器都必须实现这个关联。这意味着,实现...

    ArcGIS Engine 9.1类,接口一览表

    一个实现类一般实现了相当多的接口,为了避免所实现的接口出现方法重名,另外对这些方法有好的分类,故把实现类对象赋值给接口类型的对象,而不是直接用类来创建对象。由于创建的对象是某个接口类型的,则这个对象就...

    子接口及其实现类PPT实用.pptx

    本节将深入探讨`Collection`接口及其常用的子接口与实现类。 首先,`Collection`接口概述:它是Java集合框架的根接口,定义了集合的基本操作,如添加、删除和遍历元素。所有集合类都直接或间接地继承自`Collection`...

    动态实现接口

    接口通过`interface`关键字定义,而类通过`implements`关键字实现接口。 2. **反射(Reflection)** 反射是.NET框架提供的一种能力,允许程序在运行时获取类型信息,并能创建和操作这些类型实例。`System.Type`类...

    java 实现接口和继承关系

    如果实现类是抽象类,则可以选择部分实现或者不实现接口中的方法。 #### 示例 假设有一个接口`Animal`,其中包含一个抽象方法`makeSound()`。 ```java public interface Animal { void makeSound(); } ``` 可以...

    idea实现类快捷生成接口方法示例

    除了上述直接生成方法的方式,Idea 还提供了其他一些与接口相关的快捷操作,例如在实现类中快速导航到接口方法(`Ctrl + B`),或者查看接口的实现类列表(`Ctrl + H`,选择 "Implementing Classes")等。...

    C++接口实现总结

    这样做的好处是保持接口的纯粹性,确保所有实现该接口的类只关注接口定义的行为,而不会受到额外数据成员的影响。 6. **智能指针与接口**:在C++11及更高版本中,使用智能指针(如`std::unique_ptr`和`std::shared_...

    c# 中抽象类和接口的学习

    1. **实例化**:抽象类不能直接实例化,而接口也不能实例化,但是任何类都可以实现接口,而无需继承。 2. **成员实现**:抽象类可以包含抽象和非抽象成员,而接口只能包含抽象成员。 3. **继承限制**:C#中一个类...

    完美C语言接口源码实例实现接口实例

    实现接口的类或函数需要遵循接口定义的函数指针类型,提供相应的函数实现。在使用时,通过接口结构体的实例,调用其内部的函数指针,达到调用实际函数的目的。 6. **多态性**: 尽管C语言没有内置的多态机制,但...

    Java基础--接口类

    静态方法不属于接口的任何实现类,而是直接通过接口调用。 ```java public interface MyInterface { static void staticMethod() { System.out.println("执行静态方法"); } } ``` 6. 接口与多态: 接口是多态性...

    Java 接口 内部类

    接口可以继承多个其他接口,实现多继承的功能,但不能继承类或实现其他非接口的实体。 内部类,也称为嵌套类,可以在类的内部定义,分为静态内部类和非静态内部类(也叫成员内部类)。非静态内部类可以直接访问外部...

Global site tag (gtag.js) - Google Analytics