首先定义一个抽象的模板类,这个抽象类包括一个final的处理方法,还有需要子类继承的抽象方法,和固定的处理方法。
/**
* 模板方法,定义一个电信日志处理的模板方法
* @author Administrator
*
*/
abstract class Template {
/*
* 处理日志
*/
public final void ImplementationWork() {
getFile();
openFile();
readLogFramework();
ProcessingSingleRowLogs();
if (!isNeedUse()) {
clear();
}
}
/*
* 是否还需要使用
*/
protected boolean isNeedUse() {
return true;
}
/*
* 1、获得文件
*/
private void getFile() {
System.out.println("获得文件");
}
/*
* 2、打开文件
*/
private void openFile() {
System.out.println("打开文件");
}
/*
* 3、读取日志结构
*/
private void readLogFramework() {
System.out.println("读取日志结构");
}
/*
* 4、处理单行日志
*/
protected abstract void ProcessingSingleRowLogs();
/*
* 5、清理工作
*/
private void clear() {
System.out.println("清理工作");
}
}
实现类
public class ErrorLog extends Template {
@Override
protected void ProcessingSingleRowLogs() {
System.out.println("错误日志保存,检测");
}
@Override
protected boolean isNeedUse() {
return false;
}
}
public class ConsumerLog extends Template {
@Override
protected void ProcessingSingleRowLogs() {
System.out.println("消费日志进行记账,统计");
}
}
public class BusinessModificationLog extends Template {
@Override
protected void ProcessingSingleRowLogs() {
System.out.println("业务修改日志进行回访");
}
}
main方法
public class TemplateTest {
public static void main(String[] args) {
//错误日志的操作
System.out.println("============错误日志的操作============");
Template template1=new ErrorLog();
template1.ImplementationWork();
//业务修改日志的操作
System.out.println("============业务修改日志的操作============");
Template template2=new ConsumerLog();
template2.ImplementationWork();
//消费日志的操作
System.out.println("============消费日志的操作============");
Template template3=new BusinessModificationLog();
template3.ImplementationWork();
}
}
下面来解释一下,抽象类定义了算法的骨架,包括所有具体类都需要的执行方法(private),需要延迟到子类加载的方法(abstract),还有扩展方法(子类可以重写也可以不重写的)
private:这部分是不需要子类实现的,指的是所有具体类要执行的相同方法,然后提取出来,这样就实现了代码的复用。
abstract:这部分的代码就是必须要子类实现的方法,也就是具体类要执行的不同的方法。
扩展方法:模板定义的有具体行为的可继承的方法,子类选择性继承,父类通过返回值动态的实现一些行为。
优点:模板方法把不变的行为放在父类,需要变的行为放在子类实现,实现了代码的复用,然后使用扩展方法(也可以成为钩子)使程序更加的灵活。
缺点:java是单继承的,子类继承了模板就不能再继承其他的类了。