定义:在一个方法中定义算法的骨架,而将一些步骤延迟到子类中。
类图:
说明:AbstractClass表示抽象类,它定义一系列抽象的基本操作(Primitivie Operations),其子类可以重定义并实现一个算法的各个步骤,在AbstractClass中实现了一个模板方法,子啊模板方法中定义了一个算法的骨架,此模板方法可以调用定义在AbstractClass中的方法或其他的对象中的方法;ConcreteClass表示具体子类,它实现基本操作以完成子类特定算法的步骤。
优势:在子类中定义详细的处理算法是不会改变算法的结构;它是一种代码复用的一种基本技术。
缺点:对于不同的实现都需要定义一个子类,这会导致类的个数增加。
实例场景:对数据库的操作:连接数据库,打开数据库,操作数据库和关闭数据库,而不同的数据库,他们之间的差异主要是连接过程有所区别,其他过程相似,而且操作次序也是固定的。
实例类图:
实例代码:
/**
* 抽象数据库操作类:抽象类
* @author fly
*
*/
abstract class DBOperator {
public abstract void connDB();
public void openDB() {
System.out.println("打开数据库");
}
public void userDB() {
System.out.println("使用数据库");
}
public void closeDB() {
System.out.println("关闭数据库");
}
public void process() {
connDB();
openDB();
userDB();
closeDB();
}
}
public class OracleDBOperator extends DBOperator{
@Override
public void connDB() {
// TODO Auto-generated method stub
System.out.println("连接Oracle数据库");
}
}
public class SQLServerDBOperator extends DBOperator{
@Override
public void connDB() {
// TODO Auto-generated method stub
System.out.println("连接SQL Server数据库");
}
}
public class Client {
public static void main(String[] args) {
DBOperator operator;
operator = new SQLServerDBOperator();
operator.process();
System.out.println("---------------------------------------------");
operator = new OracleDBOperator();
operator.process();
}
}
实例代码运行结果: