今天犯了个错:

“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。

一、接口和抽象类

类,即一个对象。

先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 — 包含抽象方法的类叫做抽象类。

接口就是把抽象的深度更深,它就像用简短的非逻辑的一些规则表示类之间的关系。可以比作协议,比如通信使用的UDP/TCP协议等。

小结:类与接口是Java语言的基本抽象单元。

二、为什么有接口的两大原因

a. 向上转型为多个基类型

如此,会给开发带来相当大的灵活性。比如女神刘亦菲(Class),实现了 明星 和 女人 的接口。这样在复杂的继承结构的某类中使用它,以后在调用seeStar(Star star)或者seeWomen(Women women)方法时,只要传入其实现类(刘亦菲)即可。这也就是常说的接口可以多实现,达到了完全解耦。

b. 可复用性

即根据接口定义,让创建类有了遵循的”协议“(规则)。whatever~ 要做的仅仅建立一个接口,为了保证生成对象的非耦合。如此而来,接口的使用让代码更具可复用性,通用性和灵活性。但并不是那么万能。后面使用守则会讲到。

三、怎么用?

前人大牛总结了一些设计模式,也就是接口衍生出的一些设计模式。设计模式就是语法糖的甜蜜吧。接口让我们尝到了甜蜜。和我身边的一杯starBucks的热巧克力一样。有点太甜。比如:

a.策略模式 — 方法中参数使用接口,传入的参数对象(实现类)即包含了执行的代码。如图:

 
调用过程如下,在方法中出入实现而已:

b. 适配器模式 — 接口适配器(Interface Adapter)类,可以将不同源配到同一个目标。即暴露目标接口和实现源有共同的方法,适配器类怎么适配呢?实现目标接口,并关联了实现源对象,在实现方法中调用关联实现源真正对象,然后在里面进行各种适配操作。比如再关联一个源什么的。如图:

这其实有点AOP的味道。比如Spring AOP框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的。

c. 工厂模式 — 工厂对象将生成接口某个实现的对象。从而代码将实现和接口的实现分离,比较透明地将某个实现透明地替换成另一个实现。但是这里工厂调用方法是静态的,也就是简单工厂模式(静态工厂模式)。动态工厂模式无非是使用了反射达到了动态调用。

四、接口与抽象类的使用守则

第一、尽可能使每一个类或成员不被外界访问

这里的外界有个度,比如包级或者公有的。这样子可以更好地模块化,模块与模块之间通过暴露的api调动。这样如果有个模块改动接口或者类。只要担心该模块,而不会涉及其他模块。

第二、适当的使用类(抽象类)继承,更多的使用复合

继承,实现了代码重用。内部中使用继承非常安全,但是要记住什么时候使用继承。即当子类真正是超类的子类型时,才适用继承。否则尽可能使用复合,即在一个类中引用另一个类的实例。也就是说将另一个类包装了一下,这也就是装饰模式所体现的。

第三、优先考虑使用接口,相比抽象类

首先Java只许单继承,这导致抽象类定义收到极大的限制。二者,接口无法实现方法。但是Java 8提供了函数式接口。

但是接口在设计的时候注意,设计公有接口必须谨慎。接口如果被公开发行,则肯定会被广泛实现,那样改接口几乎不可能,会是巨大的工程。(这和我犯的错误一样。)

第四、占时没有第四了…

小结:

明白了 Java接口和抽象类何时用?怎么用?待续,有新的点补充吧

欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

初探设计:Java接口和抽象类何时用?怎么用?的更多相关文章

  1. Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

    Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅     下面比较一下两者的 ...

  2. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  3. Java—接口与抽象类

    一.接口 Java编程语言中禁止多继承属性,但可以通过接口来帮助类扩展方法.接口中可以定义大量的常量和方法,但其中的方法只是一种声明,没有具体的实现,使用接口的类自己实现这些方法. 接口与类的不同在于 ...

  4. java接口与抽象类的区别

    接口可以是标志接口,里面没有任何常量和方法. 抽象类不一定必须有抽象方法,也可也没有方法,但含抽象方法的类必须被声明为抽象类. 在抽象层次结构中,Java接口在最上面,然后紧跟着抽象类,然后是一般类. ...

  5. Java接口和抽象类的实现方法

    一.java中的接口本质上是加约束的抽象类 //抽象类 public abstract class AExample { public abstract int add(int x,int y); p ...

  6. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  7. Java接口和抽象类以及接口的意义,instanceof的利用

    接口interface: 1. 在接口中没有变量,成员无论如何定义,都是公共常量,public static final即使不显式声明也如此. 2. 所有接口方法均隐含public abstract即 ...

  8. Java 接口和抽象类区别(写的很好,转了)

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...

  9. 深入理解Java接口和抽象类

    对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...

随机推荐

  1. C++11 并发指南系列

    本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...

  2. 换个角度说工作单元(Unit Of Work):创建、持有与API调用

    看到一些工作单元的介绍,有两种感觉,第一种是很学院,说了等于没说,我估计很多都是没有自己引入到实际的项目中去,第二种是告诉我一种结果,说这就是工作单元,但是没说为什么要这么使用.所以,本篇想要探讨的是 ...

  3. 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结

    2015春节前,葡萄城的软件工程师以特有的方式来迎接新年——2015新年编程邀请赛. 邀请赛的初衷,是和大家一起,寻找编程最初的单纯的快乐.       在代码的世界里,添加动力,继续远航.      ...

  4. nginx.conf文件说明

    #Nginx所有用户和组,window下不指定 #user nobody; #工作的子进程数量(通常等于CPU数量或者2倍于CPU) worker_processes 1; #错误日志存放路径 #er ...

  5. jQuery Ztree基本用法

    1.首先在页面上有<ul/>标签 <ul id="tree" class="ztree"></ul> 2.定义ztree的配 ...

  6. atitit.gui界面纵向居中总结

    atitit.gui界面纵向居中总结 1.table法...这个简单.. 表格设置100%高度,<td align="center" valign="middle& ...

  7. atitit.dw不能显示正确的百分比高度in dw的解决

    atitit.dw不能显示正确的百分比高度in dw的解决 div 设置35%的高度,三,不能正确的显示高度...环境dw cs6 但是设置161px奏能ok了...表明这个是dw的一个bug... ...

  8. PHP--------memcache技术

    新事物的产生都不是偶然的 1.为什么会产生memcache? 在大型的电商web页面上,数据量庞大,大量用户需要同时访问海量的数据,为了提高用户的访问效果,如何才能让页面加载最快,更友好的展示到用户面 ...

  9. 正则表达式提取url中的参数,返回json字符串

    var urlstr = "www.baidu.com?a=1&b=xx&c"; var s = urlstr.split("?"); var ...

  10. 浅入“Block Formatting Context”

    本文主要是针对BFC特性的应用,至于什么是BFC,可以参看MDN的简介: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_fo ...