`
october731
  • 浏览: 86713 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

接口存在的意义只在于接口依赖注入

 
阅读更多
关于接口存在的意义,之前有一篇帖子讨论过(http://www.iteye.com/post/957921?page=1),并且跟帖无数,我也看过,这里发表一点自己的看法。抛砖引玉。
我的立场是站在spring的依赖注入的角度上来思考这个问题的。个人认为,接口存在的意义只在于接口依赖注入的时候得到淋漓尽致的体现。至于其他时候,作用则并不是那么大了。其理由如下:
1. 在非接口注入的情况下,接口的定义,某种程度上可以理解为对类的一个总的设计,因为其方法并不需要实现,所以可以更多的去思考业务上的逻辑问题,一方面更多心思的去想如何把功能点设计的更加全面,另一方面当我们在实现这个接口的时候,就会受到这个接口的方法定义的约束,这个时候尽可能多的就是考虑如何实现具体的业务的问题,而不用去考虑业务的设计的是否周全的问题。
2. 我的第二点略带否定第一点的意味。如果说只是起一个总领的作用的话,相信当初在设计这个类的时候的UML图里面就已经写的很详细了。即使我不需要这一个接口,我根据我设计完备的UML图,我一样的可以在写类的方法的时候只关注我的类的方法的实现,而不用去考虑类的方法设计是否完备。
3. 在spring的接口注入的时候,这个时候方才体现了接口的优势。我们只调用接口,接口的具体实现可以有一个,也可以有N个,但是具体调用哪一个实现,我们可以动态的根据配置文件,在具体运行的时候再来决定。这就相当于用调用接口,把更多的灵活性留给了以后的开发和维护,以及功能模块的添加。
更多的暂时还没有去想,比较仓促就先写到这里。我先抛出观点。欢迎拍砖。
分享到:
评论
78 楼 caiceclb 2009-04-14  
预先写好接口,不用考虑如何实现即可用于使用,一部分人在用,一部分人去做实现
77 楼 dengtl 2009-04-14  
接口可以认为是一种标识,实现这些接口的类代表具有某个标识特征,仅此而已
76 楼 coofucoo 2009-04-14  
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.


为什么?
75 楼 抛出异常的爱 2009-04-13  
lovit 写道
引用

java中出现 abstract ,interface两个,其中interface是为了解决多重继承的问题。
所以有时候,你会发现abstract和interface没什么区别。比如上面的程序。
但是当你要用多重继承的时候,就一定要写多个interface,而不能写多个abstract.

问题是只是继承了个接口,实现都没有办法重用。。

设计时不考虑实现
实现时不考虑全体设计.
重用?组合更好一使一些....少用继承
74 楼 bloodwolf_china 2009-04-13  
最简单例子:java Web的Filter,最常用的接口设计。
功能抽象话,提取需求,分析共同点,而不是看需求文档照猫画虎
73 楼 寻找出路的苍蝇 2009-04-13  
如果LZ参与过底层框架开发,你的工作是为开发人员提供开发平台,那么我想你对接口的认识肯定不会局限在所谓注入这样的一个层面上。
72 楼 blueion 2009-04-13  
接口在架构中静态的,它不管你的系统是如何动态运行的,它只负责构建架构(相当于铺路)。
DI是一种动态的概念,本质上就像new运算符一样负责生成接口实现的一种方式(相当于如何走路)。
我想楼主是混淆了这两个概念了。
71 楼 hy2005zyx 2009-04-13  
kaipingk 写道
有了万有引力定律,我们可以摘到苹果了, 某天楼主恍然发现原来万有引力存在的意义是摘苹果。。。。。


精辟,楼主现在是站在摘苹果人的立场上的出的结论。

希望楼主能扣顿悟。
70 楼 hy2005zyx 2009-04-13  
szgaea 写道
看来楼主还没有真正理解接口的意义,只片面地看到ssh中接口的应用,相信在经过多个项目以后,会有更深的理解。


同意szgaea的意见,楼主的出结论太片面,以偏概全。面向接口编程可能在楼主经历的那些项目中作用有限。
69 楼 lovit 2009-04-13  
引用

java中出现 abstract ,interface两个,其中interface是为了解决多重继承的问题。
所以有时候,你会发现abstract和interface没什么区别。比如上面的程序。
但是当你要用多重继承的时候,就一定要写多个interface,而不能写多个abstract.

问题是只是继承了个接口,实现都没有办法重用。。
68 楼 luoyahu 2009-04-13  
1314520ln 写道
LZ,对接口的理解太局限了吧.

同上
67 楼 bianxb_robin 2009-04-12  
事实:“接口”这个名词出现在Spring的DI之前。lz说的我认为也没什么错误。
个人愚见:1、接口的好处:在设计的时候,架构人员不用去太多考虑实现类的实现方法,把工作重心放在系统逻辑上;2、接口的目的:不用去管如何实现,但你必须符合我接口中定义的标准(方法),便于维护,实现解耦。另:Spring是一种开源框架,小弟个人对它理解:利用java的反射机制和接口概念实现的一套管理实现类的工具。小弟对Spring这个开源项目的开发人员相当的敬佩,完全是一种OO思想的实现。赞~~
66 楼 zhaobohao 2009-04-12  
jansel 写道
lovit 写道
neora 写道
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。



新手问个问题,这个和抽象类有什么区别?


abstract class Sharp {
    public abstract void draw();
}

class Rectangle extendsSharp {
    public void draw() {
        .......
    }
}


class Triangle extendsSharp {
    public void draw() {
        .......
    }
}





如果抽象类中没有任何一点实现,还不如设计成interface。


java中出现 abstract ,interface两个,其中interface是为了解决多重继承的问题。
所以有时候,你会发现abstract和interface没什么区别。比如上面的程序。
但是当你要用多重继承的时候,就一定要写多个interface,而不能写多个abstract.
65 楼 zhaobohao 2009-04-12  
抛出异常的爱 写道
由于设计失败我看见过的N多项目dao是以页面逻辑分块开发的.....正常的DAO与页面逻辑关系非常的小.
我想说的只有这句话.


应该把页面逻辑放到service里吧,dao里只做一些最基本的op??
64 楼 akiraray 2009-04-12  
接口 对于我这种总是被安排去作维护的苦命娃娃 作用比较大……
1.接口的好的命名+注释 基本就知道是干嘛的
2.介于实现接口的类和客户类都通过接口互相屏蔽……看看文档写一个单元测试(一般老项目都没单元测试……)然后就放心的去改吧……
3.系统中好的接口设计就像作文的提纲一样……过一遍大概也能知道系统走的什么流程……
4.如果你的项目文档足够牛,人员足够猛,那么请忽略我上面3点……
63 楼 jansel 2009-04-12  
lovit 写道
neora 写道
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。



新手问个问题,这个和抽象类有什么区别?


abstract class Sharp {
    public abstract void draw();
}

class Rectangle extendsSharp {
    public void draw() {
        .......
    }
}


class Triangle extendsSharp {
    public void draw() {
        .......
    }
}





如果抽象类中没有任何一点实现,还不如设计成interface。
62 楼 lovit 2009-04-12  
akiraray 写道
lovit 写道
neora 写道
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。



新手问个问题,这个和抽象类有什么区别?


abstract class Sharp {
    public abstract void draw();
}

class Rectangle extendsSharp {
    public void draw() {
        .......
    }
}


class Triangle extendsSharp {
    public void draw() {
        .......
    }
}



什么区别就看你怎么用……
用的不好和public class也没区别……


我就是不知道怎么用才能体现接口的好处。
61 楼 scott.s 2009-04-12  
对于某种技术,或者某个观点的理解程度以及方式,都是从真实实践而来的,也比较容易受制于环境;
如果经常只从事jsp,加上数据的简单CRUD逻辑,那么对于OO设计感觉似乎没有那么强烈;当然我不是说任何人,只是举个例子,类似情况也遇到过;

对于经常使用框架开发,而业务逻辑不是很复杂的情况来判断,框架强制提供的基本手法(或者套路)应该就能搞定日常工作了;这也是一个过程吧,如果有时间可以研究下所在框架的代码,那么似乎就会改变自己的看法了。

在此提个小小建议,可以先完整了解下OO的基本思想以及设计模式的做法,那么可能会进入到一个比较广阔的视野;这是一个比较漫长的过程,但是坚持下来感觉真的很不错。
60 楼 akiraray 2009-04-12  
lovit 写道
neora 写道
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。



新手问个问题,这个和抽象类有什么区别?


abstract class Sharp {
    public abstract void draw();
}

class Rectangle extendsSharp {
    public void draw() {
        .......
    }
}


class Triangle extendsSharp {
    public void draw() {
        .......
    }
}



什么区别就看你怎么用……
用的不好和public class也没区别……
59 楼 lovit 2009-04-12  
neora 写道
october731 写道
neora 写道
标题本身就是个错误的结论

愿闻其详


从基础重新学起,再去看看OO编程的基本思想。


Interface Sharp {
    public void draw();
}

class Rectangle implements Sharp {
    public void draw() {
        .......
    }
}


class Triangle implements Sharp {
    public void draw() {
        .......
    }
}



不要认为我在愚弄你,这就是接口的意义。



新手问个问题,这个和抽象类有什么区别?


abstract class Sharp {
    public abstract void draw();
}

class Rectangle extendsSharp {
    public void draw() {
        .......
    }
}


class Triangle extendsSharp {
    public void draw() {
        .......
    }
}


相关推荐

    一个轻量级的PHP依赖注入框架

    依赖注入(Dependency Injection,简称DI)是一种设计模式,它在软件工程中被广泛应用于解耦组件,提高代码的可测试性和可维护性。在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬...

    PHP依赖注入容器库

    4. **接口注入**:除了基于类的依赖注入,Auryn还支持基于接口的注入,这使得代码更加灵活,易于扩展。 5. **回调注入**:如果一个依赖需要通过特定的逻辑生成,你可以提供一个回调函数,Auryn会在需要时调用它来...

    Spring 核心机制(依赖注入)

    - **降低耦合度**:依赖注入允许组件之间通过接口进行通信,而不是直接引用具体的实现类,从而降低了组件之间的耦合度。 - **提高可测试性**:由于依赖可以通过注入的方式传递给组件,因此可以在测试时轻松替换依赖...

    Spring 学习笔记《依赖注入》源文件

    在Java开发领域,Spring框架是不可或缺的重要组成部分,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名。依赖注入是面向对象设计的一种模式,它允许我们解耦组件之间的依赖关系,使代码更加灵活,...

    利用xml解析完成依赖注入 源码

    XML解析在依赖注入中的作用在于,它提供了声明依赖关系的结构化方式。在XML配置文件中,我们可以定义bean及其依赖,Spring框架会读取这些配置并根据指示创建bean实例,建立它们之间的依赖关系。以下是一个简单的XML...

    arcgis server flex 中的依赖注入

    依赖注入的核心在于利用接口的多态性,使类之间可以通过接口来进行交互,而无需知道具体的实现细节。例如,在上述部分内容中提到了一个`Controller`接口: ```as package com.example { public interface ...

    InterfaceInjector接口注入模拟(源码下载)

    接口注入的核心在于接口,它定义了依赖对象的行为。通过定义接口,我们可以确保各个组件之间只依赖于接口,而不是具体的实现。这使得更换或升级组件变得更加简单,只需要改变接口的实现即可,无需修改依赖它的其他...

    控制反转-依赖注入详解

    控制反转(IoC)和依赖注入(DI)是软件设计模式中的重要概念,主要用于降低组件间的耦合度,提高代码的可维护性和可扩展性。IoC的核心思想是将对象的创建和管理交给一个外部容器,而不是由对象自身负责,从而实现...

    Martin Fowler 控制反转与依赖注入

    除了构造函数注入和设值方法注入之外,还有一种不太常见的依赖注入方式称为接口注入。在这种模式下,依赖项通过接口传递,而不是通过构造函数或setter方法。这种方法的优势在于它可以更灵活地处理依赖关系的变化,但...

    深入刨分依赖注入

    依赖注入(Dependency Injection,简称DI)是软件设计模式中的一种,它主要解决的是对象之间的依赖关系,使得代码更易于测试和维护。在这个主题下,我们将深入探讨依赖注入的核心概念、实现方式以及它在实际开发中的...

    模拟Spring的依赖注入

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。它极大地简化了组件之间的依赖管理,提高了代码的可测试性和可维护性。本篇文章将深入...

    Spring依赖注入使用setter设注入demo

    在Java世界中,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名。依赖注入是面向切面编程(AOP)的一个重要概念,它允许我们解耦组件,使得代码更加灵活...

    依赖注入:Dependency injection-英文书签文字版

    在Spring中,依赖注入主要通过构造器注入、setter方法注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象的实例,Spring会根据配置在XML或注解中的信息创建依赖对象并注入到目标类中。...

    mvc4 ioc 依赖注入简单示例实现

    2. **定义接口与实现**:为了演示依赖注入,我们先定义一个简单的服务接口`IService`,以及它的实现类`Service`。例如: ```csharp public interface IService { void DoSomething(); } public class ...

    struts hibernate spring 集成时使用依赖注入的方式的秘籍

    Struts、Hibernate和Spring是Java开发中非常流行的三大框架,它们各自在Web应用程序的不同层面上发挥作用:Struts处理MVC模式中的Controller部分,Hibernate负责数据持久化,而Spring则提供了全面的依赖注入...

    用Roboguice实现依赖注入-.rar

    依赖注入有三种主要方式:构造器注入、setter注入和接口注入。 **Roboguice的工作原理** Roboguice通过扫描应用的注解(Annotations)来识别对象的依赖关系。它在应用程序启动时,会自动注入所有需要的依赖。开发者...

    NetCoreDemo(依赖注入).zip

    在.NET Core中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许开发者将对象的创建和管理从实际的业务逻辑中分离出来,提高了代码的可测试性、可维护性和灵活性。本示例"NetCoreDemo(依赖...

    轻量级 Swift 依赖注入框架.zip

    5. **代码解耦**:通过依赖注入,组件之间的耦合度降低,每个组件只需要知道它依赖的接口,而不关心具体的实现。 6. **测试友好**:在单元测试中,可以轻松替换具体依赖,使用模拟(Mocks)或存根(Stubs)来隔离...

    PHP依赖注入容器库.zip

    依赖注入是一种设计模式,它允许我们解耦代码,通过外部组件将依赖关系传递给一个对象,而不是由该对象自己创建或查找依赖。这样做的好处在于,对象不再直接与特定的实现绑定,而是可以通过配置来改变其依赖关系,...

Global site tag (gtag.js) - Google Analytics