Java 设计模式 - 模板方法模式
模板方法 (TemplateMethod): 它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了,这样不同的子类就可以定义出不同的步骤。
模板类定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法的核心思想是:父类定义骨架,子类实现某些细节。模板方法是一种高层定义骨架,底层实现细节的设计模式,适用于流程固定,但某些步骤不确定或可替换的情况。
为了防止子类重写父类的骨架方法,可以在父类中对骨架方法使用 final。对于需要子类实现的抽象方法,一般声明为 protected,使得这些方法对外部客户端不可见。
Java 标准库也有很多模板方法的应用。在集合类中,AbstractList 和 AbstractQueuedSynchronizer 都定义了很多通用操作,子类只需要实现某些必要方法。
实现
定义模板类
因为声明了抽象方法,自然整个类也必须是抽象类。如何实现 init() 和 startPlay()、endPlay() 这三个方法就交给子类了。
/**
* 游戏
*/
public abstract class Game {
public final void pay() {
System.out.println("准备中...");
init();
startPlay();
endPlay();
saveRecord();
}
protected abstract void init();
protected abstract void startPlay();
protected abstract void endPlay();
/**
* 保存进度
*/
private void saveRecord() {
System.out.println("进度已保存");
}
}
定义具体实现类
子类其实并不关心核心代码 pay() 的逻辑,甚至如何保存记录 saveRecord(),它只需要关心如何完成三个子方法就可以了。
/**
* 足球游戏
*/
public class FootballGame extends Game {
@Override
protected void init() {
System.out.println("足球游戏正在加载中...");
}
@Override
protected void startPlay() {
System.out.println("开始玩足球游戏");
}
@Override
protected void endPlay() {
System.out.println("结束足球游戏");
}
}
测试验证
/**
* 测试类
*/
public class GameTest {
public static void main(String[] args) {
//玩足球游戏
Game footballGame = new FootballGame();
footballGame.pay();
}
}
后面如果要增加新的游戏,再继承 Game 实现具体的玩法,然后更换游戏即可
项目中经常用到的从数据库中或者值,为了提高速度,先从缓存中获取,那么获取值的逻辑就可以认为是骨架方法,这个从缓存中获取的方法就可以抽象到子类中实现,由具体的子类来实现用哪个缓存。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: node 模块化
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论