开发者社区> 程序员泥瓦匠> 正文

初探设计:Java接口和抽象类何时用?怎么用?

简介:
+关注继续查看

今天犯了个错:

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

 

一、接口和抽象类

类,即一个对象

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

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

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

 

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

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

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

b. 可复用性

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

 

三、怎么用?

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

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

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

image

 

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

image

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

 

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

 

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

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

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

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

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

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

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

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

第四、占时没有第四了…

 

小结:

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Jenkins+Blue Ocean】docker部署Jenkins,编写Jenkinsfile创建流水线,一篇解决“贼带劲”
Jenkins 是一个持续集成工具,可用于自动化与构建、测试、交付或部署软件相关的各种任务。 Jenkins 可以通过本机系统包、Docker 安装,甚至可以由任何安装了 Java 运行时环境 (JRE) 的机器独立运行。 持续集成工具还有Drone、Gitlab-CICD(gitlab内置cicd)还要kubesphere容器云平台也能做持续集成(CICD)kubesphere是借助于Jenkins来实现CICD,本身没有该功能。 本章就带各位简单搭建Jenkins和使用Jenkins+Blue Ocean及编写Jenkinsfile流程。
2 0
js的严格模式(strict mode)
JavaScript 严格模式(strict mode)即在严格的条件下运行。 "use strict" 指令只允许出现在脚本或函数的开头。 为什么使用严格模式: 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代码运行的安全; 提高编译器效率,增加运行速度; 为未来新版本的Javascript做好铺垫。
4 0
JavaScript 对象入门使用JSON
JavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据
4 0
如何实现多账号共享VPC
多账号共享VPC架构具备上下通吃的特点,今天就给大家介绍一下这个架构要如何落地实施。
4 0
“玩转链表”第一弹(算法 NO.3)
本文所列题目来自 LeetCode 中国网站,属于算法面试中关于链表的经典高频考题(“玩转链表”第一弹)。题解由 Doocs 开源社区 leetcode 项目维护者提供
3 0
从零开始学设计模式(十八):状态模式(State Pattern)
状态模式(State Pattern)指的是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,在其内部状态改变时改变它的行为。状态模式是一种对象行为型模式。它和策略模式有一点很像,就是将一些复杂的逻辑放在一个专门的上下文类中进行处理。
5 0
比赛背景 Background
比赛背景 Background
3 0
+关注
程序员泥瓦匠
公号:程序员泥瓦匠,关注交个朋友吧
289
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载