设计模式之–模板方法模式
简介:
本篇文章是介绍 23 中设计模式中的行为型设计模式中的
模板方法模式
.使用的是 Java 代码.
目录:
1.什么是模板方法模式
定义:
某个方法的实现需要多个步骤, 其中有些步骤是固定的; 而有些步骤并不固定, 存在可变性. 为了提高代码的复用性和系统的灵活性, 可以使用模板方法模式应对. (我的理解就是用抽象类来实现)
定义一个操作中的算法框架, 而将一些步骤延迟到子类中, 使得子类不改变一个算法的结构即可重新定义算法的某些特定步骤.
结构:
- AbstractClass(抽象类)
抽象类, 定义了一套算法框架.实现类里面有时候会包含
钩子方法
- ConcreteStragety(具体实现类)
具体实现类.
钩子方法
:
一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现。
2.模板方法模式的使用场景和优点
使用场景:
- 多个子类有共有的方法, 并且逻辑基本相同时.
- 面对重要, 复杂, 的算法, 可以把核心算法设计为模板方法, 周边相关细节功能则由各个子类实现.
- 需要通过子类来决定父类算法中的某个步骤是否执行, 实现子类的反向控制.
优点:
- 模板方法模式通过把不变的行为搬移到超类, 去除子类中的重复代码.
- 子类实现算法的某些细节, 有助于算法的拓展.
缺点:
- 每个不同的实现都需要定义一个子类, 这会导致类的个数和增加, 设计更加抽象.
3.模板方法模式的简单运用
创建抽象类, 定义算法框架
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 abstract void overTime();
public void sleep(){
System.out.println("sleep~");
}
//模板方法
public final void process(){
getUp();
breakfast();
goToWork();
working();
lunch();
working();
if(isOverTime){
overTime();
}
goHome();
supper();
sleep();
}
//钩子方法
protected boolean isOverTime(){
return true;
}
}
具体实现类
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#overTime()
*/
@Override
public void overTime() {
System.out.println("overTime: 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~");
}
@Override
public boolean isOverTime() {
return false;
}
}
客户端调用
public class Main {
public static void main(String[] args) {
Day programmerDay = new ProgrammerDay();
programmerDay.process();
}
}