多态性、抽象类应用和模板方法模式学习

一、多态性

1、定义

多态性就是对象在运行过程中的多种形态,面向对象三大特性之一。

2、分类

  1. 方法的重载与重写
  2. 对象的多态性

例如:用父类引用指向子类对象(用大的类型去接收小的类型,向上转型、自动转换)

3、多态性小结

在编程时针对抽象类型的编写代码,称为面向抽象编程(或面向接口编程),父类通常都定义为抽象类或接口。

  1. 方法的重载和重写就是多态性的表现;
  2. 多个子类就是父类中的多种形态;
  3. 父类引用可以指向子类对象,自动转型;
  4. 子类对象指向父类引用需要强制转换(注意:类型不对会报类型转换异常);
  5. 在实际开发中,尽量使用父类引用(更利于扩展)。

二、父类的设计法则

1、instanceof关键字

当我们需要把父类的实例强制转换为子类引用时,为了避免类型转换异常(java.lang.ClassCastException),那么我们需要在转换之前做类型检查。

2、设计法则

通过instanceof关键字,我们可以很方便的检查对象的类型,但如果一个父类的子类过多,这样的判断还是显得繁琐,那么如何去设计一个父类呢?

  1. 父类通常情况下都设计为接口或抽象类,其中优先考虑接口,若接口不能满足要求才考虑抽象类。
  2. 一个具体的类尽可能不去继承一个具体的类,这样的好处是无需检查对象是否为父类对象。

三、抽象类应用--模板方法模式

1、定义

模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中。模板方法模式使得子类可以在不改变一个算法的结构即可重新定义该算法的某些特定的步骤。

2、代码实现

模板抽象父类
public abstract class BaseManager {

	public static void main(String[] args) {
		BaseManager um = new UserManager();
		um.action("jiji", "del");
	
		BaseManager cm = new ClassManager();
		cm.action("admin", "add");
	}

	// 这里的action()方法就是算法的骨架,在子类中可以有不同的实现方式
	// 将验证是否是管理员这个操作放在了父类,做到了代码的重用
	public void action(String usrname, String methodName) {
		if ("admin".equals(usrname)) {
			execute(methodName);
		} else {
			System.out.println("你没有此权限,请联系管理员!");
		}
	}

	// 延迟到子类实现的抽象方法
	public abstract void execute(String methodName);
}
不同的实现一
class UserManager extends BaseManager {

	// 执行execute()方法之前需要验证是否是管理员,验证通过才能进行相关操作
	@Override
	public void execute(String methodName) {
		if ("add".equals(methodName)) {
			System.out.println("执行了添加用户的操作!");
		} else if ("del".equals(methodName)) {
			System.out.println("执行了删除用户的操作!");
		} else {
			System.out.println("执行默认操作,啥也不干");
		}
	}

}
不同的实现二
class ClassManager extends BaseManager {

	// 执行execute()方法之前需要验证是否是管理员,验证通过才能进行相关操作
	@Override
	public void execute(String methodName) {
		if ("add".equals(methodName)) {
			System.out.println("执行了添加班级的操作");
		} else if ("del".equals(methodName)) {
			System.out.println("执行了删除班级的操作!");
		} else {
			System.out.println("执行默认操作,啥也不干");
		}
	}

}
原文地址:https://www.cnblogs.com/zxfei/p/10843278.html