首先簡單描述一下我工作(Android程序員)的一天,7點起牀洗漱,9點打卡上班,上午寫Android代碼,12點喫午餐,下午1點到6點寫Android代碼,6點下班,如果需求緊急就要加班到晚上八點。接下來我描述一下我同事(Java程序員)的一天,8點起牀洗漱,九點打卡上班,上午寫java代碼,12點喫午飯,下午1點到6點寫java代碼,6點下班,如果需求緊急就要加班到晚上八點。我們的一天好像被人安排好了,起牀、打卡上班、寫代碼、喫午飯、寫代碼、下班(但也可能加班)。像是一個的模版固定的生活步驟,只是起牀時間和寫什麼代碼不同罷了。
模式定義:定義一個操作中的算法的骨架,而將步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義算法的某些特定步驟。
案例分析:固定的生活步驟就是算法的骨架,而起牀時間和寫代碼就是可以重新定義的某些特定步驟。
優點:控制算法,封裝不變,拓展可變
注意:分清哪些是不變,哪些是可變。
代碼:首先定義模板類
public abstract class Programmer {
//程序員姓名
protected String name;
public Programmer(String name) {
this.name = name;
}
//起牀
public void getUp() {
System.out.println(name + "6點起牀上班");
}
//九點打卡上班
public final void punchCard(){
System.out.println(name + "9點打卡上班");
}
//工作
public abstract void work();
//午餐
public void lunch(){
System.out.println(name + "喫午餐");
}
//下班
public final void offDuty() {
System.out.println("下午6點,下班時間到");
}
//回家
public final void goHome() {
System.out.println(name+"回家");
}
//是否加班(鉤子方法)
public boolean isOverTime() {
return false;
}
//加班到晚上八點
public void overTime() {
System.out.println(name + "需要加班到晚上八點才能下班");
}
/**
* 程序員的一天(模板方法,子類不可重寫)
*/
public final void oneDay() {
getUp();//起牀
punchCard();//打卡
work();//寫代碼
lunch();//喫中午飯
work();//寫代碼
offDuty();//下班
if (isOverTime()) {//是否要加班
overTime();//加班到八點
goHome();//加完班回家
}else {
goHome();//回家
}
}
}
兩個實現類:一個Android程序員、一個Java程序員public class AndroidProgrammer extends Programmer {
public AndroidProgrammer(String name) {
super(name);
}
@Override
public void getUp() {
System.out.println(name + "7點起牀上班");
}
@Override
public void work() {
System.out.println(name + "寫Android代碼");
}
}
public class JavaProgrammer extends Programmer {
public JavaProgrammer(String name) {
super(name);
}
@Override
public void getUp() {
System.out.println(name + "8點起牀上班");
}
@Override
public void work() {
System.out.println(name + "寫java代碼");
}
@Override
public boolean isOverTime() {
System.out.println("Java需求緊急");
return true;
}
}
測試類:public class Test {
public static void main(String args[]) {
Programmer zuowei = new AndroidProgrammer("佐爲");
zuowei.oneDay();
System.out.println("============================");
JavaProgrammer zongjie = new JavaProgrammer("宗介");
zongjie.oneDay();
System.out.println("============================");
}
}
結果:
佐爲7點起牀上班
佐爲9點打卡上班
佐爲寫Android代碼
佐爲喫午餐
佐爲寫Android代碼
下午6點,下班時間到
佐爲回家
============================
宗介8點起牀上班
宗介9點打卡上班
宗介寫java代碼
宗介喫午餐
宗介在工作,編寫java程序
下午6點,下班時間到
Java需求緊急
宗介需要加班到晚上八點才能下班
宗介回家
============================
這裏講一下鉤子方法,默認程序員是不加班isOverTime()返回false。當子類重寫鉤子方法isOverTime()並返回ture,才執行加班步驟。通俗講鉤子方法就是控制特定步驟要不要執行。