`
jipengyun2008
  • 浏览: 32559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

接口和抽象类应该怎么使用

阅读更多
对于刚刚接触Java的人来讲经常的一个疑问就是“接口与抽象类有何不同?”,为了回答这个问题,我们可以从一个扩展Spring Controller的例子来看看接口与抽象类的不同及如何将其使用在OO设计中。



需求的场景是这样的:扩展Controller实现返回Json数据格式的Ajax的Controller,对于继承后的子类只需实现返回要序列化为Json数据格式的对象,而无需关注如何返回Json数据。



实现了需求场景的实例:



基本接口定义,定义返回Json数据格式的方法。扩展的抽象类需实现此方法。

Java代码 
public interface JsonProvider {  
      
    abstract void pushJsonResponse(HttpServletResponse response, Object obj) throws IOException;  
 


public interface JsonProvider {

    abstract void pushJsonResponse(HttpServletResponse response, Object obj) throws IOException;

}

实现了接口的抽象类,此类实现了接口中定义的pushJsonResponse()方法,并加入了新定义的抽象方法handleJsonRequest(),供子类实现

Java代码 
/** 
* 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;  
    }  
 


/**
* 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序列化的对象即可

Java代码 
/** 
* 类说明:<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;  
    }  
 


/**
* 类说明:<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设计中如何使用接口及方法的深刻理解还需我们在实际使用中体会其美妙之处,好的设计使代码简洁易懂,易于维护和扩展,在日积月累也不会变的腐臭不堪,会长久的保持其简单的复杂度。基本的设计原则就是类的单一职能,允许扩展但不容更改。所以很多经验是积累的结果,要善于总结和钻研,所以有时偏执的完美主义者才能成功。作为软件开发者完美主义能让你成长的更快。

分享到:
评论

相关推荐

    java利用接口和抽象类改写求圆的面积和梯形的面积.docx

    在了解了接口和抽象类的定义和使用格式之后,我们可以根据以下几点来选择使用接口还是抽象类: 1. **成员实现详情**:抽象类可以提供成员的实现详情,而接口不能。如果你希望在抽象类中提供某些方法的默认实现,则...

    详细解析Java中抽象类和接口的区别

    - **抽象类**:继承抽象类使用`extends`关键字。 - **接口**:实现接口使用`implements`关键字。 这反映了两者在概念上的不同定位:抽象类强调的是“是什么”的关系(例如,狗是动物的一种),而接口强调的是“能做...

    Java 接口和抽象类

    在 Java 中,抽象类使用 abstract 关键字声明。 在上面的练习中,我们使用抽象类来编写 Java 程序。首先,我们创建了一个名为 LivingThing 的抽象类,该类表示生物类。然后,我们创建了两个具体实现类:Human 和 ...

    接口与抽象类区别

    在软件开发中,接口和抽象类是两个常用的概念,但它们之间的区别却让许多人感到困惑。那么,什么是抽象类和接口?它们之间有什么区别?下面,我们就来详细地探讨这个问题。 一、抽象类 抽象类是一种特殊的类,它不...

    接口和抽象类使用详细实例源代码

    在编程世界中,接口(Interface)和抽象类(Abstract Class)是面向对象设计的...通过阅读和分析“接口和抽象类使用详细实例源代码”,开发者可以更好地掌握这两种重要概念,并将其应用到自己的项目中,提升软件质量。

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    在C#编程语言中,类、接口、虚...在选择使用抽象类还是接口时,应根据项目需求和设计原则来权衡。例如,如果需要共享部分实现并有继承关系,可以选择抽象类;如果需要多个类实现一组共同行为,接口可能是更好的选择。

    11.java接口和抽象类的区别.zip

    11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别....

    10.java接口和抽象类的相似性.zip

    10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和抽象类的相似性.zip10.java接口和...

    1.5:接口和抽象类的区别.pdf

    4.实现抽象类和接口的类必须实现其中的所有方法。 抽象类中可以有非抽象方法。接口中则不能有实现方法。如果接口或者抽象类的子类不想实现则继续携程一个抽象方法 5.接口中定义的变量默认是public static final ...

    C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

    C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例 C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

    java 抽象类与接口的练习

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,供其他类去实现或继承。在这个练习中,我们将深入理解这两种机制,并通过实际的代码示例和注释来加深理解。 首先,让我们讨论...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    Java抽象类和接口和继承之间关系

    "Java抽象类和接口和继承之间关系" Java抽象类和接口是两种不同的概念,它们之间存在着继承关系。在Java中,抽象类(abstract class)和接口(interface)都是用来描述对象的行为和状态的,但它们之间有着明显的...

    Java语言的接口与抽象类

    Java语言的接口与抽象类是面向对象编程中的关键概念,它们在设计模式和代码组织中起着重要作用。这里我们将深入探讨这两个概念,并分析它们的异同。 首先,接口(Interface)是Java中的一种特殊类型,它通过使用`...

    接口和抽象类的区别(面向对象)

    接口与抽象类的区别 抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。 动物类要有呼吸方法。怎么呼吸就是子类的事了。 现在有很多讨论和建议提倡用interface代替abstract类,两者从...

    java中接口与抽象类的详细分析与比较

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...

    抽象类和接口实验报告.doc

    抽象类和接口实验报告

    接口和抽象类

    理想的设计应该是灵活的、可扩展的,并且易于维护,而这通常需要接口和抽象类的合理组合使用。在实际开发中,开发者应充分理解两者的特点和局限,根据实际场景做出明智的选择,以构建出更加健壮和灵活的软件系统。

    抽象类和接口

    在编程领域,抽象类和接口是面向对象设计中的两个重要概念,它们用于实现代码的抽象和多态性。本实验旨在帮助你深入理解和熟练运用这两种机制。 首先,让我们来看看抽象类。抽象类是一种不能被实例化的类,它通常...

    抽象类和接口的区别

    ### 抽象类与接口的区别 在面向对象编程中,抽象类和接口是两种非常重要的概念,它们在软件设计和实现过程中发挥着不可替代的作用。...开发者应根据实际需求灵活选择使用抽象类还是接口,以达到最佳的设计效果。

Global site tag (gtag.js) - Google Analytics