Java面向接口编程定义:
1、接口将其抽象方法的实现交给实现该接口的类,而抽象类是将其抽象方法的实现交给其子类;
2、使用面向接口编程的核心思想是使用接口回调,即接口变量存放实现类的对象的引用,从而回调实现类重写后的接口方法;
如下代码↗:
一个接口(小艾同学),中间类(创建接口变量,实现接口回调)、实现类(小艾各个爱好)、测试类(调用方法进行传参)
//接口
public interface interfaceClass {
//创建抽象方法,进行小艾同学爱好的设置
void setHooby();
}
//中间类
public class middleClass {
//创建方法,进行接口变量ifc引用的赋值
public void getHooby(interfaceClass ifc){
ifc.setHooby();
}
}
//实现类,实现接口
public class singClass implements interfaceClass {
//重写接口的抽象方法,设置爱好
public void setHooby() {
System.out.print(" 唱歌 ");
}
}
//实现类,实现接口
public class danceClass implements interfaceClass {
//重写父类的抽象方法,设置爱好
public void setHooby() {
System.out.print(" 跳舞 ");
}
}
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
//调用方法,进行传参
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
}
}
以上代码中,接口 interface 拥有两个实现类,通过方法传参完成 接口变量ifc 引用的赋值,从而调用实现类重写后的接口方法;
代码输出结果:
小艾的爱好有:
唱歌 跳舞
总结:
面向接口编程的目的:是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。
面向接口编程 的 " 开-闭 " 原则 :
" 开-闭 " 原则 指:让设计的系统对 扩展开放,对 修改关闭;
以上面代码为例:
扩展开放: 指可以对实现接口的实现类进行扩展,即当需求变化时,可以重新创建一个实现类来完成需求;
修改关闭: 指对接口与中间类的修改是关闭的,一旦它们设计完成后,就不能进行修改了;(当然,不是说一定不能进行修改)
如以上代码中,进行 " 开-闭 " 原则 :
增加一个实现接口的实现类,实现 小艾同学爱好的扩展 ;
//实现类,实现接口
public class runClass implements interfaceClass {
//重写父类的抽象方法,设置爱好
public void setHooby() {
System.out.print(" 跑步 ");
}
}
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
mc.getHooby(new runClass());
}
}
那么代码输出结果:
小艾的爱好有:
唱歌 跳舞 跑步
" 开-闭 " 原则 总结 :
在设计系统时,应当首先考虑用户需求的变化,将 应对用户需求变化的部分 设计为 扩展开放,而 设计的核心部分(基本结构) 设计为 修改关闭 的 ;
如以上代码:
接口的实现类、测试类 是 扩展开放的;
接口、中间类 是 修改关闭的;
与接口有关的匿名内部类实现 " 开-闭 " 原则:
匿名内部类就是一个类的子类,只是它是没有类名的,使用就无法声明对象,但可以通过父类的构造方法直接创建对象;
对于使用匿名内部类实现 " 开-闭 " 原则,以上面代码为例:
为接口创建一个匿名内部类,来完成 扩展开放(需求的扩展);
//测试类
public class testClass {
public static void main(String[] args) {
System.out.println("小艾的爱好有:");
middleClass mc = new middleClass();
mc.getHooby(new singClass());
mc.getHooby(new danceClass());
mc.getHooby(new runClass());
//接口的匿名内部类
mc.getHooby(new interfaceClass(){
//重新接口的抽象方法
public void setHooby() {
System.out.println("画画");
setMethod();
}
//匿名内部类自己定义的方法
public void setMethod(){
System.out.println("我是匿名类自己定义的方法:小艾同学画画很厉害");
}
});
//匿名内部类结束
}
}
通过 new interfaceClass(){ } 创建一个接口 interfaceClass 的匿名内部类,并重写抽象方法;
代码输出结果:
小艾的爱好有:
唱歌 跳舞 跑步 画画
我是匿名类自己定义的方法:小艾同学画画很厉害