[b]模板方法模式:[/b]
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法的实现需要语言层面的支持:比如继承,多态。
[b]关注点:[/b]
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
[b]模式中的角色:[/b]
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。
[b]注意点:[/b]
一般把模板方法定义成final避免被子类修改
JDK中的体现:
ThreadPoolExecutor.Worker
[img]http://hi.csdn.net/attachment/201101/3/0_129405958555W9.gif[/img]
[b]举例:[/b]
角色:抽象模板
具体子类:
客户端:
输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法的实现需要语言层面的支持:比如继承,多态。
[b]关注点:[/b]
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
[b]模式中的角色:[/b]
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。
[b]注意点:[/b]
一般把模板方法定义成final避免被子类修改
JDK中的体现:
ThreadPoolExecutor.Worker
[img]http://hi.csdn.net/attachment/201101/3/0_129405958555W9.gif[/img]
[b]举例:[/b]
角色:抽象模板
package com.pichen.dp.behavioralpattern.templatemethod;
public abstract class Day {
public void getUp(){
System.out.println("get up~");
}
public abstract void breakfast();
public abstract void goToWork();
public abstract void working();
public abstract void lunch();
public abstract void goHome();
public abstract void supper();
public void sleep(){
System.out.println("sleep~");
}
//模板方法
public final void process(){
getUp();
breakfast();
goToWork();
working();
lunch();
working();
goHome();
supper();
sleep();
}
}
具体子类:
public class ProgrammerDay extends Day{
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast()
*/
@Override
public void breakfast() {
System.out.println("breakfast:noodle~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork()
*/
@Override
public void goToWork() {
System.out.println("goToWork:drive car~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#working()
*/
@Override
public void working() {
System.out.println("working: coding~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch()
*/
@Override
public void lunch() {
System.out.println("lunch: eat rice~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome()
*/
@Override
public void goHome() {
System.out.println("goHome: walk~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper()
*/
@Override
public void supper() {
System.out.println("supper: rice~");
}
}
客户端:
public class Main {
public static void main(String[] args) {
Day programmerDay = new ProgrammerDay();
programmerDay.process();
}
}
输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~