JAVA中Abstract到底有什么用?都用在哪些方面比较合适?
功能向上聚合
Abstract作为抽象类和抽象方法,第一种情况是在聚合子类的通用性上起到作用,往往出现在重构过程中自然而然形成的一种层次结构~希望将多个子类的通用方法和逻辑提取到父层的抽象类。
这种重构情况的最极致表现就是:若再加入新的子类,子类只需要实现抽象类的abstract方法,而且可能就只用几句话的简单声明,或者做一些属性设置就可以了,往往只是用于区分子类的特征,真正的逻辑处理实际上是在抽象类的方法内实现。这样就极大地简化了子类的代码逻辑量,实现子类层去耦合,抽象层高内聚的极佳效果
如下图所示:可以看到流水线作为一个统一的对象抽象概念,下辖了分拣、抽检、加工等子工序...,但是流水线是一个密集的工序,肯定具有大量上下文处理逻辑在里面,那么就加上一个抽象的类,交给抽象类来做,各个子工序只需要将自己份内的工序实现好就可以了。由抽象类来实现工序连接,上下文管理等,统一成为接口方法具体实现的逻辑代表。

设计模式中使用
咱们再举个例子,Java MVC框架的鼻祖Struts Framework,是由Craig R. McClanahan设计创造。我相信很多人都听说过Struts框架,其设计的Action对象都已经成为Web开发中控制的代名词。这也是最早基于JavaEE的servlet规范的WEB层框架,让老早的程序员见识到了MVC是什么样子(当然1.0并不是彻底的MVC),
好,我们看看他的一个非常简化的架构图,我们重点是说明它对Abstract的使用:

Struts1.x版本的内部使用了过滤链模式和命令模式的组合,当客户端向Servlet发起请求,那么作为Servlet的Struts实现ActionServlet就将请求调度进了Struts框架来处理。
我们可以看到图中ActionCommand作为接口抽象,ActionCommandBase作为命令链的统一入口层抽象,AbstractCreateActoin、AbstractAuthorizeAction、AbstractExectionAction作为对业务Action的创建、授权和执行(Execture)的命令抽象层,最后一层CreateAction、AuthorizeAction、ExectionAction为父类提供具体Action的实现类。另外还有选择、跳转、异常等命令,
就是以命令链条串起来的形式,从Action被创建或选择,到Action执行以及跳转的Action全生命周期管理。
那么我们从这个示例中看到了抽象(abstract)被大量的使用,主要就是通过设计模式的引入,将“业务执行(Action)”这个抽象的概念,在流程中用命令的方式进行了全生命周期的管理。那么程序员写的Action就彻底与Servlet解耦了,中间是通过Struts框架的过滤链和命令两种设计模式的操作,使得控制层彻底独立出来。备注:MVC的模型和视图不在这个架构描述当中。
因此无论是以后的Struts2.0也好,Spring MVC也好,基本上都是沿着Struts1.0的设计思想进行不断的优化。但是大体的方向在那个时候都已经成型了。唯独是面向组件的JSF标准是另一种思路了,顺便提一下,JSF的最初的规范设计还是Craig R. McClanahan操刀的。


JAVA中Abstract到底有什么用?都用在哪些方面比较合适?的更多相关文章
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- java中POJO类和DTO类都要实现序列化
java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序 ...
- `Java`中`abstract class`与`interface`区别
abstract class Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号). 以下是abstract方法 ...
- Java中abstract和interface的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- Java中abstract class 和 interface 的解释和他们的异同点(转)
(一)概述 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...
- java中abstract和interface的區別(轉)
(一)概述 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...
- 在JAVA中线程到底起到什么作用
这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread ...
- JAVA中abstract,interface,final,static语法
转自:http://www.cnblogs.com/yueue/archive/2010/04/20/1715863.html 一,抽象类:abstract 1,只要有一个或一个以上抽象方法的 ...
- JAVA中线程到底起到什么作用!
这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread ...
随机推荐
- wrf模拟的domain图绘制
wrf模拟的区域绘制,domain图,利用python的cartopy库绘制模拟区域 参考Liang Chen的draw_wrf_domian.py这个代码, 出处python画wrf模式的模拟区域 ...
- Redis 超详细自动管理Cluster集群工具上手 redis-trib.rb (多图,手把手)
安装介绍 redis-trib.rb是一款由Redis官方提供的集群管理工具,能够大量减少集群搭建的时间. 除此之外,还能够简化集群的检查.槽迁徙.负载均衡等常见的运维操作,但是使用前必须要安 ...
- 使用Drone构建Docker映像
使用Drone构建Docker映像 实践所用软件: Git Gogs Drone Docker 私有镜像仓库 实践链接:https://www.katacoda.com/courses/cicd/bu ...
- APP或者前端通过识别用户代理详细信息和浏览器数据进行安全防御
使用用户代理解析API 识别 访问您网站的浏览器,机器人,操作系统和设备 上手免费 阅读文档 解码用户代理 识别检测浏览器,操作系统,平台,设备类型以及其他30多个字段 多种浏览器,机器人,手机,平板 ...
- 配置redis 4.0.11 集群
配置redis 4.0.11 集群 准备redis 软件和redis配置文件 启动Redis服务 /data/soft/redis/src/redis-check-aof --fix /log/red ...
- 关gzip压缩,我有新发现
1 gzip的压缩效果是立竿见影的: 2 网站是否开启gzip的查看方式 2.1 打开Chrome浏览器,按 F12打开调试面板 2.2 切换到network页签,在网络请求列表的表头,鼠标右键==& ...
- shell脚本 4 函数与正则
shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 ...
- JAVAEE_Servlet_19_重定向可以解决页面刷新问题(sendRedirect)
重定向可以解决页面刷新问题(sendRedirect) 在向数据库中添加数据的时候,如果使用转发(getRequestDispatcher),数据插入成功后,转发到提示插入成功页面,在数据插入成功页面 ...
- Day16_97_IO_FileOutputStream 写入字节流
FileOutputStream 写入字节流 * java.io.OutPutStream -----> java.io.FileOutputStream 将计算机内存中的数据写于磁盘中. * ...
- kubespray续签k8s证书
查看证书过期时期 [root@node1 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not ...