设计模式简介以及接口和抽象类的异同

            首先声明这篇文章可能有点枯燥乏味 

下面开始正式内容啦。。。。。。。。

####什么是设计模式####

设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计结构的总结。设计模式的使用使代码更加的容易理解、可读性强、便于维护。

面向对象

面向对象OO = 面向对象的分析OOA +面向对象的设计OOD +面向对象的编程OOP;

面向对象的特征:封装、继承、多态

设计模式简介以及接口和抽象类的异同_第1张图片

在软件设计中模型设计的使用非常有用,对于一个大的项目,设计模型的合理使用更牵扯到软件后期的维护以及软件设计的成本和软件质量等等问题。那么什么是设计模式呢?简单来说设计模式就是对于具体的项目需求总结实现一种合理的设计技巧,设计模式就是程序人员对于具体问题的理解以及解决办法的结合。在同一个问题上,不同的程序设计人员看问题的角度不同,那么解决问题的思路就有所不同,进而所运用的设计模式就是不同了,那么应该使用那种设计模式来解决项目中的问题呢?没有那种设计模式好而那种设计模式不好,而是对于相同的问题,那种设计模式更加适合此问题的解决。设计模式的运用是为了解决具体的问题,所以归根结底设计模式的应用在于问题的解决

设计模式=问题分析+代码实现,问题分析决定了使用那种设计模式

在软件开发中经过前人多年的开发经验总结出了对于大多数问题适用的23种最常用的设计模式,在软件设计过程中,根据具体的问题选择具体合适的设计模式是关键。

在这23种设计模式中又分为接口型责任性构造型操作型扩展型 5大类。


今天主要来分析什么是接口型模式,并且围绕以下几个问题来说明什么是接口型模式。

接口模型模式:

1. 什么是接口模型?

2. 接口模型包括哪些模型?

3. 接口模型的特点?

4. 接口和抽象类的区别?

5. 接口和委托的区别?

首先解决第一个问题,什么是接口模型?

接口型模式是通过提供接口间接的实现响应的解决方案

接口型模式又包括适配器模式外观模式合成模式以及桥接模式等具体的模式

接口型模式不仅可以用一个接口抽象一个对象提供的服务,还可以用一组接口抽象一群对象的交互。


在了解接口模型之前我们首先先要了解什么是接口和与接口相像的抽象类以及两者之间的异同。那么什么是接口以及什么是抽象类呢?

通过interface定义的为接口,通过abstract class定义的为抽象类。

abstract class和interface之间有很大的相似性,甚至可以相互替换

但是abstract class是不能实例化的,主要用来进行类型隐藏

实现abstract class和interface的类必须实现其中定义的所有方法

EX:

抽象类定义:

abstract class Demo{

abstract void method();

}

接口定义:

interface Demo{

void method();

}

在abstract class中可以有自己的数据成员,并且可以有非abstract的成员方法,

在interface中只能有(static final)静态的不能被修改的数据成员,但是一般不会定义,在interface中所有的方法都是abstract的


abstract class在java中表示一种继承关系,一个类只能实现一个

interface在Java中一个类可以实现多个

abstract class中的方法中可以有具体的方法实现,但是在interface中不能有方法实现

interface中定义的变量默认是public static final类型的,必须给定初值,具体的实现方法中不能改变其值

抽象类中的变量是friendly型,其值可以再子类中重新定义,也可以重新赋值,

接口中的方法默认都是public abstract

在abstract class中可以赋予方法默认的行为,而在interface中并不能这样做,为了绕开这个限制,那么就需要使用委托,但是这样就增加了复杂度并且会造成维护上的麻烦。那么在项目中到底使用abstract class呢还是使用interface呢还是使用两者相结合的方式?????

文章开头就已经明确的表示,设计模式的应用在于问题的分析。正确合理的看待问题才是合理使用设计模式的关键。下面举个小小的例子来说明在具体的问题中应该如何分析问题以及选择出正确的设计模式,同时明白看待问题的角度以及问题分析是否透彻对于设计模式选用的影响。

假设在一个关于动物的抽象概念,动物可以吃和睡觉,此时我们 可以通过abstract class和interface定义一个抽象的概念模型。

EX:

abstract class Animal{

abstract void eat();

abstract void sleep();

}

interface Animal{

void eat();

void sleep();

}

此时两者使用起来没有什么区别,可以通过extends 使用abstract class 或者implement 使用interface

此时需要加一个抓老鼠的功能。那么该如何实现?可能我们首先想到的是直接将功能通过方法定义在接口和抽象方法中,那么此时就会出现问题。当一个类需要继承抽象类或者实现接口来定义另一种动物呢,比如一个牛?但是在继承或者接口的实现过程中多两个抓老鼠的功能,牛会抓老鼠吗?显然不会,但是在定义的这个牛的类中明显的切必须的又需要实现一个抓老鼠的功能,这显得有点不伦不类,结合到软件设计中就是违反了面向对象设计中的一个核心原则ISP。

对于此问题分析吃和睡以及抓老鼠可能属于两个不同的概念,那么我们应该把他分别定义在代表这两个概念的抽象类中。此时有引出一个问题,到底是定义两个抽象类呢?还是定义两个接口?亦或者定义一个抽象类和一个接口?此时问题的解决就不仅仅局限在问题本身了,可能涉及到解决问题的语言的额运用上,对于Java来说定义两个抽象类的方式显然是行不通的嘛,Java语言本身就不支持多继承,剩下的两种方式如何选择呢?此时就反映出了对于问题的分析以及理解、对于设计意图的反应是否正确、合理了。

如果我们选择了定义两个接口来实现的方式,那么我们可能还没有充分的理解问题的本质,我们把吃和睡以及抓老鼠理解为同等级的问题了。通过下面的图我们来结合问题分析和感受下到底吃和睡以及抓老鼠是不是同等级的问题

设计模式简介以及接口和抽象类的异同_第2张图片

通过上图可以分析,吃和睡是所有动物都具有的本能,而抓老鼠只是少部分的动物的能力,两个显然不是同等级的。

所以我们采用定义两个接口的形式显然是不合理的,因此我们选择定义一个接口再定义一个抽象类的方式来对此问题的实现。

如果我们换个思考方式,如果定义一个类,这个类对象在本质上先会抓老鼠然后才是吃和睡,那么此时我们选用的设计模式就不合适了。。。。所以看待问题的方向以及对问题的理解都会影响设计的实现。。。。。

abstract class反应的是一种“is - a”的关系。interface反应的是“like-a”的关系。


通过以上的分析我们总结一下几点:

1.抽象类是一种继承关系,一个类只能实现一个,但是可以同时实现多个接口

2.在抽象类中可以有自己的数据成员,也可以由非抽象的成员方法,在接口中只能有静态的不能修改的数据成员,所有的成员方法都是抽象的

3.抽象类和接口反应的设计理念不同,“is- a”  “like - a”

4.实现抽象类和接口都必须实现其中的所有方法,抽象类中可以有方法的具体实现,但是接口中只能有方法的定义不能有具体的实现

5.接口中定义的变量是public static final类型的,且必须有初始值,实现类不能重新定义也不能改变其值

6.抽象类中的变量是friendly类型的,实现类中可以改变并且可以重新定义

7.接口中的方法默认是public abstract型的



最后,再小小的提一下接口和委托的区别吧:

接口可以包含属性、索引、方法以及事件。但是委托不能包含事件。。。。。














你可能感兴趣的:(接口和抽象类的异同,设计模式简介)