Java面向接口编程与其" 开-闭 " 原则、接口的匿名内部类实现 " 开-闭 " 原则

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 的匿名内部类,并重写抽象方法;

代码输出结果:

小艾的爱好有:
 唱歌  跳舞  跑步 画画
我是匿名类自己定义的方法:小艾同学画画很厉害

发布了57 篇原创文章 · 获赞 10 · 访问量 7528

猜你喜欢

转载自blog.csdn.net/LagerSwan/article/details/104393474