1.模板方法模式
定义了一个算法的骨架,并允许子类为某些步骤提供具体的实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
2.模板方法模式的基本概念
1)AbstractClass(抽象类)
定义了一个模板方法,该方法包含了一些基本的操作(通常是抽象方法或钩子方法)。
提供了默认实现的一些基本操作。
2)ConcreteClass(具体类)
继承自 AbstractClass,并实现其中的抽象方法或钩子方法.
可以覆盖一些方法以提供不同的实现。
3.举个栗子:
例如:人的一周,周一到周五上班,周六周日可以做自己喜欢的事.对于工作和空闲时间;其他的相对固定,如吃饭,刷牙,睡觉,这些比较固定,可以通过abstract实现模板类,通过继承实现抽象方法,或钩子函数
4.代码实现:
1)抽象类
java
package org.xiji.template;
/**
* 人的一周抽象类
*/
public abstract class OnePersonWeek {
/**
* 一个人的一天
*/
public void onePersonDay(){
wakeUp();
brushTeeth();
eat();
if(judgeDay()){
goToWork();
goHome();
}else{
System.out.println("今天不上班");
doMyFavourThing();
}
sleep();
}
//起床
public void wakeUp(){
System.out.println("起床");
}
//刷牙
public void brushTeeth(){
System.out.println("刷 teeth");
}
//吃饭
public void eat(){
System.out.println("吃 food");
}
//上班
public void goToWork(){
System.out.println("上班");
}
//下班
public void goHome(){
System.out.println("下班");
}
//睡觉
public void sleep(){
System.out.println("睡觉");
}
//判断今天是星期几(这个是抽象钩子函数)
public abstract boolean judgeDay();
//可以做任何事(这个是抽象函数)
public abstract void doMyFavourThing();
}
2)抽象类实现类
java
package org.xiji.template;
/**
* 模板方法实现类
*/
public class MyDay extends OnePersonWeek{
//
private int day=1;
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
/**
*
* 判断是否是周末
*/
@Override
public boolean judgeDay() {
if (this.day == 0 || this.day == 6) {
return false;
}
return true;
}
/**
* 做自己喜欢的事情
*/
@Override
public void doMyFavourThing() {
System.out.println("今天出去散步,心情愉悦");
}
}
3)测试类
java
package org.xiji.template;
/**
* 模板模式
*/
public class TemplateMain {
public static void main(String[] args) {
MyDay myDay = new MyDay();
for (int i = 0; i < 7; i++) {
System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
myDay.setDay(i);
myDay.onePersonDay();
System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
}
}
}
4)运行结果