对于刚刚接触Java的人来讲经常的一个疑问就是“接口与抽象类有何不同?”,为了回答这个问题,我们可以从一个扩展Spring Controller的例子来看看接口与抽象类的不同及如何将其使用在OO设计中。
需求的场景是这样的:扩展Controller实现返回Json数据格式的Ajax的Controller,对于继承后的子类只需实现返回要序列化为Json数据格式的对象,而无需关注如何返回Json数据。
实现了需求场景的实例:
基本接口定义,定义返回Json数据格式的方法。扩展的抽象类需实现此方法。
public interface JsonProvider {
abstract void pushJsonResponse(HttpServletResponse response, Object obj) throws IOException;
}
实现了接口的抽象类,此类实现了接口中定义的pushJsonResponse()方法,并加入了新定义的抽象方法handleJsonRequest(),供子类实现
/**
* Description:<br>
* Origin Time: 2009-6-12 上午11:07:18<br>
*
* @author Seraph<br>
* @email:seraph115@gmail.com<br>
*/
public abstract class JsonProviderController extends AbstractController
implements JsonProvider {
private static final Log log = LogFactory
.getLog(JsonProviderController.class);
public void pushJsonResponse(HttpServletResponse response, Object obj)
throws IOException {
if (obj == null) {
obj = new Object();
log.warn("obj is null");
}
ResponseUtils.setJsonHeader(response);
PrintWriter out = response.getWriter();
out.print(JsonUtils.toJson(obj));
out.close();
}
protected abstract Object handleJsonRequest(HttpServletRequest request,
HttpServletResponse response);
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Object obj = handleJsonRequest(request, response);
pushJsonResponse(response, obj);
return null;
}
}
继承后的子类,享用了抽象类实现的接口方法,自己只需要实现抽象类中的抽象方法,返回要Json序列化的对象即可
/**
* 类说明:<br>
* 创建时间: 2008-8-15 上午11:07:55<br>
*
* @author Seraph<br>
* @email: seraph115@gmail.com<br>
*/
public class AsyncMenuProviderController extends JsonProviderController {
private TreeManager treeManager;
public void setTreeManager(TreeManager treeManager) {
this.treeManager = treeManager;
}
@Override
protected Object handleJsonRequest(HttpServletRequest request,
HttpServletResponse response) {
String rootId = request.getParameter("id");
List<AsyncTreeNode> result = new ArrayList<AsyncTreeNode>();
List<AsyncTreeNode> list = treeManager.getLowerTreeNodeByRole(rootId);
if (null != list) {
result = list;
}
return result;
}
}
此例同时使用了接口和抽象类,完成了扩展自SpringController得JsonProviderController,便于让继承后的子类完成返回Json数据格式的能力。其中在抽象类中实现了繁琐的返回Json数据格式的方法,让后续的子类大大简化了代码,甚至感觉不到与普通的Controller有何不同。
接口定义了统一的行为,对于此行为可以有多种实现,而实现接口的抽象类完成了绝大部分的工作,把脏活和累活都一个人承担了下来,留给子类一个需实现的抽象方法来调用。
让我们回过头来看看刚才的问题,即“接口与抽象类的不同”:
从此例中我们可以看出接口完成的是定义统一的行为,同时也是对所实现类的一种归类和约束,告诉了我们实现此接口的类都具有相同的特性,应归为一类,在很多应用设计中我们使用空定义的接口来划分类的规属及关系,接口补充了Java的多继承能力而又不会导致象C++中由多继承引发的程序复杂化问题;
而抽象类即可以实现方法又可以定义抽象方法,抽象类可以替子类实现部分功能,把其中变化的部分交给子类来完成,具体是可以把子类共有的代码放入抽象类中完成,此复用可以大大简化代码量及其利用率。
所以接口就像是本儿武当派的秘籍,是种规范,规定你如何去打,如何运用此门武功。而抽象类更像是你武当派的师傅,他教你怎样打,并告诉徒弟们应该有创新,应该有自己的招式,这样在他的指导下你就进步了,学会了本来不会的武功,并专注于研究你自己的招式。
对于OO设计中如何使用接口及方法的深刻理解还需我们在实际使用中体会其美妙之处,好的设计使代码简洁易懂,易于维护和扩展,在日积月累也不会变的腐臭不堪,会长久的保持其简单的复杂度。基本的设计原则就是类的单一职能,允许扩展但不容更改。所以很多经验是积累的结果,要善于总结和钻研,所以有时偏执的完美主义者才能成功。作为软件开发者完美主义能让你成长的更快。
分享到:
相关推荐
其次,Spring MVC是Spring框架中的Web层组件,它遵循Model-View-Controller设计模式,实现了业务逻辑、数据和用户界面的分离。Spring MVC为控制器、模型和视图提供了清晰的分界,使得代码结构更清晰,更易于测试和...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
3. Spring:Spring框架是Java企业级应用的事实标准,它是一个全面的后端解决方案,涵盖了依赖注入、AOP(面向切面编程)、Web MVC、数据访问、事务管理等多个方面。Spring的核心是IoC(Inversion of Control,控制...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
它采用了模型-视图-控制器(Model-View-Controller,MVC)的设计模式,将业务逻辑、数据和用户界面分离,提高了代码的可维护性和可测试性。SpringMVC通过DispatcherServlet接收请求,然后分发给相应的处理器,最后将...
Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...
3. **Model-View-Controller (MVC)架构**:MVC是一种常见的设计模式,在Java Web开发中广泛使用。模型(Model)负责数据管理,视图(View)呈现用户界面,控制器(Controller)处理用户请求并协调模型和视图。...
3. **MVC (Model-View-Controller)**: MVC是一种设计模式,常用于Web开发中。在Java Web中,Spring框架提供了强大的MVC支持。模型负责数据处理,视图负责显示结果,控制器则处理用户请求并协调模型和视图。 4. **...
Thymeleaf支持变量表达式(`#{...}`),它们可以引用Java对象的属性,或者从Spring上下文中获取消息。例如,`${variable}`用于引用Java表达式的结果,而`#{message.key}`则用于获取国际化消息。 4. **条件语句**:...
MVC(Model-View-Controller)模型是一种常用的设计模式,主要用于组织应用程序的结构,使其更加清晰、模块化。它将应用程序划分为三个核心部分: 1. **Model(模型)**:模型代表了应用程序的核心数据和业务逻辑。...
对于个人学习和分享,这种结构也有助于理解整个文件上传流程,从用户界面到后台处理,再到数据存储。 总的来说,"upload.zip"压缩包中涉及的知识点包括Java Web开发、MVC设计模式、文件I/O操作、云存储API的使用、...
Struts2是一个强大的Java Web应用程序框架,用于构建和维护可扩展、易于维护的MVC(Model-View-Controller)架构的Web应用。这个"第一个struts2程序"是初学者入门Struts2框架的一个基础练习,它将帮助你理解如何配置...
它是Apache软件基金会旗下面向对象(OO)设计模式的开源框架,旨在简化开发过程,提供可扩展性和灵活性。在Java Web开发领域,Struts2因其强大的功能和丰富的插件支持而广受欢迎。 在“struts2基本jar包”中,包含...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它由Apache软件基金会维护。这个框架的主要目标是简化Java Web应用的开发,提供一种有效且可扩展的方式来处理动作调度、视图渲染以及...
可以使用JAX-RS(Java API for RESTful Web Services)框架如Jersey或Spring MVC实现。 2. 数据绑定:通过JAXB(Java Architecture for XML Binding)可以将XML数据自动转换为Java对象,简化数据处理。 3. 安全性...