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

Java面向抽象编程定义:

1、面向抽象编程指:当设计某些重要的类时,不让该类面向具体的类,而是面向抽象类,即抽象类是各个类的父类;

2、所设计的类中的重要数据是由抽象类声明的对象调用的,而不是具体类的对象,即通过方法传参,创建各个类的上转型对象;

如下代码↗:

创建一个抽象类(小艾同学),中间类(创建上转型对象)、子类(小艾各个爱好)、测试类(调用方法进行传参)

//抽象类
public abstract class Abstract {
      //创建抽象方法,进行小艾同学爱好的设置
	abstract void setHooby();
}
//中间类
public class middleClass {
    //创建方法,进行上转型对象引用的赋值
	public void getHooby(Abstract abs){
		abs.setHooby();
	}
}
//子类
public class singClass extends Abstract {

	//重写父类的抽象方法,设置爱好
	void setHooby() {
		System.out.print(" 唱歌 ");
	}

}
//子类
public class danceClass extends Abstract {
	//重写父类的抽象方法,设置爱好
		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());
	}
}

以上代码中,各个类面向的是 抽象类Abstract ,而不是某个具体的类;通过上转型对象 abs,进行调用各个子类相应的方法;

代码输出结果:

小艾的爱好有:
 唱歌  跳舞 

总结:

面向抽象编程的目的:是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。

面向抽象编程的核心:是让类中每种可能的变化对应地交给抽象类的一个子类去负责;


面向抽象编程 的 " 开-闭 " 原则 :

" 开-闭 " 原则  指:让设计的系统对 扩展开放,对 修改关闭;

以上面代码为例:

扩展开放: 指可以对继承抽象类的子类进行扩展,即当需求变化时,可以重新创建一个子类来完成需求;

修改关闭: 指对抽象类与中间类的修改是关闭的,一旦它们设计完成后,就不能进行修改了;(当然,不是说一定不能进行修改)

如以上代码中,进行  " 开-闭 " 原则  :

增加一个继承抽象类的子类,实现 小艾同学爱好的扩展 ;

//子类扩展
public class runClass extends Abstract {
	//重写父类的抽象方法,设置爱好
			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 Abstract(){

			//重新抽象类的抽象方法
			void setHooby() {
				System.out.println("画画");
				setMethod();
			}
			//匿名内部类自己定义的方法
			void setMethod(){
				System.out.println("我是匿名类自己定义的方法:小艾同学画画很厉害");
			}
			
		});
              //匿名内部类的结束
	}
}

通过 new Abstract(){ } 创建一个抽象类 Abstract 的匿名内部类,并重写抽象方法;

代码输出结果:

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

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

猜你喜欢

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