行为型模式——模板方法模式
2020-09-06 本文已影响0人
Doooook
一、概念
模板方法模式,定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
二、实现
我们将创建一个定义操作的 AbstractGame 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 AbstractGame 的实体类,它们重写了抽象类的方法。
AbstractGame
/**
* @author: Jay Mitter
* @date: 2020-09-06 19:59
* @description: 抽象类,它的模板方法被设置为 final
*/
public abstract class AbstractGame {
/**
* 初始化游戏
*/
abstract void initialize();
/**
* 开始游戏
*/
abstract void startPlay();
/**
* 结束游戏
*/
abstract void endPlay();
/**
* 模板
*/
public final void play(){
// 初始化游戏
initialize();
// 开始游戏
startPlay();
// 结束游戏
endPlay();
}
}
Cricket
/**
* @author: Jay Mitter
* @date: 2020-09-06 19:59
* @description: 板球
*/
public class Cricket extends AbstractGame {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
Football
/**
* @author: Jay Mitter
* @date: 2020-09-06 19:59
* @description: 足球
*/
public class Football extends AbstractGame {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
测试
/**
* 行为型模式——模板方法模式
*/
@Test
public void testBehaviorTemplateMethod() {
AbstractGame game = new Cricket();
game.play();
System.out.println("=====================");
game = new Football();
game.play();
}
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
=====================
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
总结
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。