接口的作用?

hehuang139 2015-07-26 10:26:10
不好意思,也许我这个问题很低级,但是困恼自己好久,今天鼓起勇气问下大家,希望各位oo大神能不吝赐教
如题,有一个和接口非常相似的存在:抽象类,它们都是对职责的抽象,区分2者还是比较简单的,抽象类表示是is-a,表示一个类型,是类型的抽象,而接口是行为的抽象。
一个抽象类的方法并不能用来用来定义一个类型,举个例子:猫会叫,但是会叫的不一定是猫,比如说闹钟也会叫。既然如此,那一个行为到底是该定义在抽象类中,还是应该定义在接口中。比如说刚才的例子,叫这个行为到底应该定义在猫中,还是应该定义在ISayable接口中?问题在推广下,何时该把类中的行为抽出来定义成一个接口,也就是何时该使用接口?个人意见这里面一定有业务层面的考虑,没有一个决定的标准,比如说如果只有一个猫这种抽象,没有闹钟这个抽象就没有必要用专门定义一个ISayable接口
经常有接口的滥用,个人认为接口的滥用更多的是凡是都用接口,比如现在的service+impl设计模式,明明只有一个实现类,一定要都定义一个接口
目前自己的开发经验是这样的:从重构的观点去看接口的定义,一开始是没有任何接口的,只有无所的类,在需求不断变更中,发现共性的行为及行为的不同实现,在抽取成接口。也就是说在承认自己水平不够的情况下(无法一下子考虑行为的抽象),不建议一开始就定义接口,而是随着需求的变化中去添加接口
...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
op456654po 2015-07-28
  • 打赏
  • 举报
回复
对。你的做法在软件设计中就是叫做提取机制,机制很重要。机制和角色类构成了我们通常听到的框架,你应该很熟悉吧,如微软的.net框架,Apache的struct框架等。这些著名的框架你肯定调用过他们或者在他们的基础上扩展过。其实你正在做的事情也就是在写一个小型框架,只不过你不知道而已。
Johnny_de 2015-07-27
  • 打赏
  • 举报
回复
抽象和接口的区别还有一点是代码的重用,接口只是契约。接口作为高层设计的一种标准,在设计阶段忽略代码实现细节而用接口的模式设计。另一方面,接口的作用不是简单的行为分离,如果只是基于这层去理解接口的作用就有点狭隘。行为分离最简单的方式应该是分离到其他类里面。 考虑到设计思路,我认为始终应该是个自上而下的过程方式,比方说你在实现一个组件或者系统,首先不是从代码角度去审视,而是多从领域模型去抽象出设计方案和解决方案。你只有搞清楚里面的整体业务体系及关联,才能设计出搞笑的解决方案,最终的代码实现只不过是堆砌过程。
hehuang139 2015-07-27
  • 打赏
  • 举报
回复
引用 2 楼 op456654po 的回复:
楼主你的最后一句 :不建议一开始就定义接口... 这句话是非常正确的,同样也是非常重要的。接口和抽象类都是在对象和对象协作时为了能够可扩展,可复用而引入的,他们都是系统的扩展点。没有协作的话引入接口就没有意义了。所以 ,我是非常地反对一上来就为类写一个接口。 1.接口一般用来增加灵活性,切换性。他更接近于一种角色的概念,一个对象经常在系统不同的协作中扮演不同的角色,所以你会经常看到一个类可以实现多个接口,这也体现了接口隔离原则。 2.抽象类一般用来提高系统重用性,你只要extends就能重用父类的方法,并且将一些行为绑定在一起,避免分散到不同类中。混入类常常就是这样的一个类
我目前做的设计就是从具体的类出发,不断的向上(抽象层次高的)向下(抽象层次低的)的方向迭代,向下就合并相同的行为,向下就分解可变性的不同表象。
hehuang139 2015-07-27
  • 打赏
  • 举报
回复
引用 1 楼 Johnny_de 的回复:
抽象和接口的区别还有一点是代码的重用,接口只是契约。接口作为高层设计的一种标准,在设计阶段忽略代码实现细节而用接口的模式设计。另一方面,接口的作用不是简单的行为分离,如果只是基于这层去理解接口的作用就有点狭隘。行为分离最简单的方式应该是分离到其他类里面。 考虑到设计思路,我认为始终应该是个自上而下的过程方式,比方说你在实现一个组件或者系统,首先不是从代码角度去审视,而是多从领域模型去抽象出设计方案和解决方案。你只有搞清楚里面的整体业务体系及关联,才能设计出搞笑的解决方案,最终的代码实现只不过是堆砌过程。
你说的这些,我也都明白,但是我想问的是行为到底在何种情况下定义在接口中,比如说一个抽象类有很多行为方法,到底哪些该抽离成一个接口。 同时我也赞同你说的领域分析的观点,有深厚的领域知识,或者就是一个领域专家,设计出一个优秀的接口应该是比较简单的。但是对于一般的业务不是很清楚的项目,个人认为自上而下的思路,容易创建出过分抽象实际没有过大 意义的接口。
op456654po 2015-07-27
  • 打赏
  • 举报
回复
楼主你的最后一句 :不建议一开始就定义接口... 这句话是非常正确的,同样也是非常重要的。接口和抽象类都是在对象和对象协作时为了能够可扩展,可复用而引入的,他们都是系统的扩展点。没有协作的话引入接口就没有意义了。所以 ,我是非常地反对一上来就为类写一个接口。 1.接口一般用来增加灵活性,切换性。他更接近于一种角色的概念,一个对象经常在系统不同的协作中扮演不同的角色,所以你会经常看到一个类可以实现多个接口,这也体现了接口隔离原则。 2.抽象类一般用来提高系统重用性,你只要extends就能重用父类的方法,并且将一些行为绑定在一起,避免分散到不同类中。混入类常常就是这样的一个类

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧