核心
当功能内部一部分实现时确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
1.模板方法模式实现
abstract class Test {
public final void getTime(){ //模板方法,此功能如果不需要复写,可加 final 限定
long start = System.currentTimeMillis();
code(); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
long end = System.currentTimeMillis();
System.out.println("毫秒是:"+(end-start));
}
public abstract void code(); //抽象不确定的功能,让子类复写实现
}
class Test2 extends Test{
public void code(){
for(int i =0; i < 10; i++){
System.out.println("y");
}
}
}
public class Test3 {
public static void main(String[] args){
// TODO 此为main方法
Test test = new Test2();
test.getTime();
}
}
2.日程模板
在模板方法模式中,基本方法包括:抽象方法、具体方法。
abstract class Test {
public final void schedule(){ //模板方法,此功能如果不需要复写,可加 final 限定
goOut();
byMethod(1); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
work();
byMethod(0); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
goHome();
}
public void goOut(){//具体方法
System.out.println("出门");
}
public abstract void byMethod(int j); //抽象不确定的功能,让子类复写实现
public abstract void work();//抽象不确定的功能,让子类复写实现
public void goHome(){//具体方法
System.out.println("回家");
}
}
class Test2 extends Test{
public void byMethod(int j){
if(j == 1){
System.out.println("开车");
}else {
System.out.println("走路");
}
}
public void work(){
System.out.println("工作修改程序bug");
}
}
public class Test3 {
public static void main(String[] args){
// TODO 此为main方法
Test test = new Test2();
test.schedule();
}
}
运行结果:
出门
开车
工作修改程序bug
走路
回家
3.在模板方法模式中,基本方法包括:抽象方法、具体方法和钩子方法,正确使用“钩子方法”可以使得子类控制父类的行为。
abstract class Test {
public final void schedule(){ //模板方法,此功能如果不需要复写,可加 final 限定
buyLottery();
if(checked()){
System.out.println("查看是否中奖中......");
result(); //不确定的功能部分,提取出来,通过子类实现抽象方法实现
}else{
System.out.println("搞忘去看中奖没有,错失了一个亿。");
System.out.println();
}
}
public void buyLottery(){//具体方法
System.out.println("突然心血来潮购买了一注彩票");
}
public boolean checked(){//钩子方法
return true;
}
public abstract void result();
}
class Test2 extends Test{
public boolean checked(){
return false;
}
public void result(){
}
}
class Test4 extends Test{
public boolean checked(){
return true;
}
public void result(){
System.out.println("果然是天选之子,中奖啦。");
System.out.println();
}
}
public class Test3 {
public static void main(String[] args){
// TODO 此为main方法
Test test = new Test2();
test.schedule();
Test test1 = new Test4();
test1.schedule();
}
}
运行结果:
突然心血来潮购买了一注彩票
搞忘去看中奖没有,错失了一个亿。
突然心血来潮购买了一注彩票
查看是否中奖中......
果然是天选之子,中奖啦。