总所周知Java 是一门面向对象的编程语言,在Java世界中万物皆对象,而面向对象的三个基本特征是:封装、继承、多态。相信绝大多数Java程序员对于这些概念都是熟得不能再熟了,但是未必真正的领悟并且在开发中能做到融会贯通,事实上很多所谓的常见的设计模式本质上都是巧妙地把三个基本特征结合起来,重新设计的框架,所以千万不要觉得面向对象很简单。另外注意我上文加重的文字,时时刻刻去体会感悟,相信对于你的代码质量会有意想不到的提高的。
接口(Interface)在JAVA编程语言中是一个抽象类型(Abstract Type),是一系列方法的声明,是一些方法特征的集合,接口里只有方法的签名(和常数声明(变量生命仅包括 static 及 final))而没有方法的具体实现,它被用来强制实现类必须实现指定的方法,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类(Abstract Class)。以上是官方的语言定义,用我们自己的话来说就是:接口是一种方法与实现分离的结构化的方式,允许创建者确定方法名、参数列表和返回类型,本质就是提供方法给外部调用,而调用者无需知道具体的内部实现细节。
何为面向接口再封装呢?在Java中万物皆对象,这意味着什么不仅仅是一些实体对应着一个对象,连Java语法的一些基本元素也可以对应着一个对象,自然可以把接口再封装成为一个对象。
如上图所示,把最常见的一个OnClickListener接口分为红、绿边框两块,分别对应构成接口的两大部分:接口名和方法,其中方法又可以细分为四部分:方法名、返回值、参数列表、方法体。
方法名——可以抽象为字符串,可以与接口名组合在一起作为对象的一个成员变量,可以通过构造方法传递进来,从而达到区分不同类的接口的目的
返回值——主要分为两大类,有返回值和无返回值,其中有返回值的类型不确定,可以通过泛型来代替
参数列表——也分为两大类,有参数和无参数,其中有参数类型的还可以分为只有一个参数和不定参数的,一个参数的可以用泛型来代替,而不定参数的此处我们将用集合来实现封装
方法体——所有的接口中的方法体都是空的,可以抽象为抽象方法
经过以上对接口进行解剖不难得出接口主要可以分为:
返回值 | 参数列表 |
---|---|
无返回值 | 无参数 |
无返回值 | 有一个参数 |
有返回值 | 无参数 |
有返回值 | 有一个参数 |
无返回值 | 不定参数 |
有返回值 | 不定参数 |
package arch;
/**
* Auther: Crazy.Mo on 2018/4/9 16:56
* Summary:把接口中的方法抽象封装,每一个接口都有一个方法名(暂且约定同一接口里方法名唯一),这是共性,可以把接口名.方法名抽象为基类
*/
public abstract class AbsFunction {
private String mFuncName;//对应接口名.方法名
public AbsFunction(String pFuncName) {
mFuncName = pFuncName;
}
public String getFuncName() {
return mFuncName;
}
}
package arch;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象无参无返回值类型的接口
*/
public abstract class FunctionNoParamNoResult extends AbsFunction {
/**
* @param pFuncName 为了区分接口名 以接口名.方法名的形式
*/
public FunctionNoParamNoResult(String pFuncName) {
super(pFuncName);
}
/**
* 此处设计思想是:通常接口里的方法体都是空的,所以可以抽象为抽象方法,方法抽象就可以延迟其实现,从而保证了扩展性,其次再把方法看成由方法名、返回值、参数三部分构成,分别进行抽象
*/
public abstract void function();//无参对应参数为空,无返回值对应void
}
package arch;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象无参有返回值类型的接口
*/
public abstract class FunctionNoParamWithResult<Result> extends AbsFunction {
public FunctionNoParamWithResult(String pFuncName) {
super(pFuncName);
}
public abstract Result function();//通过泛型传递,有返回值但类型未定对应泛型 Result,无参对应空
}
package arch;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象有参无返回值类型的接口
*/
public abstract class FunctionWithParamNoResult<Param> extends AbsFunction {
public FunctionWithParamNoResult(String pFuncName) {
super(pFuncName);
}
public abstract void function(Param pParam);//通过泛型传递,有参对应Param,无返回值对应void
}
package arch;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象有参有返回值类型的接口
*/
public abstract class FunctionWithParamWithResult<Param,Result> extends AbsFunction {
public FunctionWithParamWithResult(String pFuncName) {
super(pFuncName);
}
public abstract Result function(Param pParam);
}
这里我是把参数封装到集合中,把集合作为形参传递,也可以用不定参数来传递
package arch;
import java.util.ArrayList;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象有可变参数无返回值类型的接口
*/
public abstract class FunctionWithVariableParamsNoResult extends AbsFunction {
public FunctionWithVariableParamsNoResult(String pFuncName) {
super(pFuncName);
}
public abstract void function(ArrayList
package arch;
import java.util.ArrayList;
/**
* Auther: Crazy.Mo on 2018/4/9 17:03
* Summary: 按照参数和返回值类型来区分接口,此处继续抽象有可变参数有返回值类型的接口
*/
public abstract class FunctionWithVariableParamsWithResult<Result> extends AbsFunction {
public FunctionWithVariableParamsWithResult(String pFuncName) {
super(pFuncName);
}
public abstract Result function(ArrayList
以上完成了接口再抽象的第一步,如感兴趣请见下文分解设计模式——面向对象进阶之面向接口再抽象实现通用的接口框架(二)。