模板模式,和算法有什么关系呢?
模板模式,在什么场景使用呢?
模板模式(Template Pattern),定义一个算法的骨架,把算法中的变与不变分离开来,封装不变的部分,扩展变的部分,又称模板方法模式。它是一种行为型模式。
业务场景:一次性实现一个算法不变的部分,并将可变的行为留给子类实现。
关键代码:在抽象类里,使用final修饰算法中不变的部分;可变的部分由子类重写。
下面看UML类图:
类图说明:图中有三个类,运动抽象类AbstractExercise,和两个继承者跑步类Run、游泳类Swim,它们不变的部分是运动exercise方法,运动之前的活动beforeExercise方法,运动之后的活动afterExercise方法,具体的运动doExercise方法。变化的是跑步类、游泳类中的具体的运动前、运动中、运动后的具体实现。类图中只有一种关系:继承。
下面看代码实现:
1.运动抽象类;
/**
* 1.运动抽象类
* @author 程就人生
* @Date
*/
public abstract class AbstractExercise {
/**
* 模板/模板方法
*/
public final void exercise(){
// 运动前的拉伸活动
beforeExercise();
// 进入锻炼
enterExercise();
// 运动后的拉伸
afterExercise();
}
/**
* 热身
*/
abstract void beforeExercise();
/**
* 进入锻炼
*/
abstract void enterExercise();
/**
* 拉伸
*/
abstract void afterExercise();
}
2.抽象类的继承者;
/**
* 2.1 跑步类
* @author 程就人生
* @Date
*/
public class Run extends AbstractExercise{
@Override
void beforeExercise() {
System.out.println("跑步前的热身运动...");
}
@Override
void enterExercise() {
System.out.println("跑步中...");
}
@Override
void afterExercise() {
System.out.println("跑步后的拉伸运动...");
}
}
/**
* 2.2 游泳类
* @author 程就人生
* @Date
*/
public class Swim extends AbstractExercise{
@Override
void beforeExercise() {
System.out.println("游泳前的热身运动...");
}
@Override
void enterExercise() {
System.out.println("游泳中...");
}
@Override
void afterExercise() {
System.out.println("游泳后的拉伸运动...");
}
}
3.测试代码;
public static void main(String[] argo){
// 跑步
AbstractExercise run = new Run();
run.exercise();
System.out.println();
// 游泳
AbstractExercise swim = new Swim();
swim.exercise();
}
运行结果:
跑步前的热身运动...
跑步中...
跑步后的拉伸运动...
游泳前的热身运动...
游泳中...
游泳后的拉伸运动...
代码说明:去过健身房的伙伴们都知道,无论哪种健身,健身流程都是一样的,运行前先热身,然后进入正式的运动,运动过后再拉伸。抽象运动类AbstractExercise定义了健身的流程,至于运动前的具体活动、进入正式锻炼、运动后的活动则放在了子类实现。上面便是模板模式的简单实现。
最后总结
模板模式,它是一个和算法有关系的设计模式。它使用抽象类锁定算法流程,其子类负责具体实现,和其他设计模式还是有很大区别的。
思考题:你现在还能想起几个和算法有关的设计模式?在项目中有没有模板模式使用的业务场景呢?你又是如何处理的呢?还有优化空间吗?
网友评论