一模式定义
模板方法模式:定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
二模式举例
1模式分析
我们借用每日生活行为来说明这一模式。
2模板方法模式静态类图
3代码示例
3.1建立算法骨架一AbstractPeople
package com.demo.template;
/**
* 抽象工人
*
* @author
*
*/
public abstract class AbstractPeople {
/**
* 起床方法
*/
public void getUp() {
System.out.println("起床...");
}
/**
* 抽象吃早餐方法
*/
protected abstract void haveBreakfast();
/**
* 抽象乘坐交通工具方法
*/
protected abstract void transport();
/**
* 工作方法
*/
public void doWork() {
System.out.println("工作...");
}
/**
* 模板方法(每天的行为)
*/
public final void dayLift() {
System.out.println("====================");
// 起床
getUp();
// 早餐
haveBreakfast();
// 交通工具
transport();
// 工作
doWork();
System.out.println("====================");
}
}
3.2具体工人A一PeopleA
package com.demo.template;
/**
* 工人A
*
* @author
*
*/
public class PeopleA extends AbstractPeople {
/**
* 具体吃早餐方法
*/
@Override
protected void haveBreakfast() {
System.out.println("A早餐吃三明治,喝牛奶...");
}
/**
* 具体乘坐交通工具方法
*/
@Override
protected void transport() {
System.out.println("A开私家车上班...");
}
}
3.3具体工人B一PeopleB
package com.demo.template;
/**
* 工人B
*
* @author
*
*/
public class PeopleB extends AbstractPeople {
/**
* 具体吃早餐方法
*/
@Override
protected void haveBreakfast() {
System.out.println("B早餐喝粥,吃小菜...");
}
/**
* 具体乘坐交通工具方法
*/
@Override
protected void transport() {
System.out.println("B坐公共汽车上班...");
}
}
3.4具体工人C一PeopleC
package com.demo.template;
/**
* 工人C
*
* @author
*
*/
public class PeopleC extends AbstractPeople {
/**
* 具体吃早餐方法
*/
@Override
protected void haveBreakfast() {
System.out.println("C早餐吃煎饼,喝豆浆...");
}
/**
* 具体乘坐交通工具方法
*/
@Override
protected void transport() {
System.out.println("C坐地铁上班...");
}
}
3.5客户端测试一Client
package com.demo;
import com.demo.template.AbstractPeople;
import com.demo.template.PeopleA;
import com.demo.template.PeopleB;
import com.demo.template.PeopleC;
/**
* 主应用程序
*
* @author
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 创建A、B、C三个工人
AbstractPeople peopleA = new PeopleA();
AbstractPeople peopleB = new PeopleB();
AbstractPeople peopleC = new PeopleC();
// 展示三个工人每天的行为
peopleA.dayLift();
peopleB.dayLift();
peopleC.dayLift();
}
}
4运行结果
====================
起床...
A早餐吃三明治,喝牛奶...
A开私家车上班...
工作...
====================
====================
起床...
B早餐喝粥,吃小菜...
B坐公共汽车上班...
工作...
====================
====================
起床...
C早餐吃煎饼,喝豆浆...
C坐地铁上班...
工作...
====================
三该模式设计原则
1"开-闭"原则
2好莱坞原则
四使用场合
1一次性实现一个算法的不变部分,井将可变的行为留给子类实现。
2各子类中具有公共行为的时候,应被提取出来并集中到一个公共父类以避免代码重复。
3当需要控制子类扩展的时候。模板方法在特定点调用钩子操作,这样只允许在某些点进行扩展。
五模板方法静态类图