白话-23种设计模式12-模板模式
【摘要】 一、白话 玩游戏的时候,特别是以前的单机游戏,细心的同学就会发现,开始界面都是 进入游戏、继续游戏、设置、退出这几个按钮。但是各个按钮点击后的结果都是不同的(退出例外)。无论是足球游戏,篮球游戏,射击游戏,都是这样,那基于复用,完全可以将相同的东西提取出来,作为一个模板存在,但是没有细节,具体的细节交给不同的对象各自负责。如果相同的,就模板统一管理,这样,就能大程度上统一风格和复用。同时,...
一、白话
玩游戏的时候,特别是以前的单机游戏,细心的同学就会发现,开始界面都是 进入游戏、继续游戏、设置、退出这几个按钮。但是各个按钮点击后的结果都是不同的(退出例外)。无论是足球游戏,篮球游戏,射击游戏,都是这样,那基于复用,完全可以将相同的东西提取出来,作为一个模板存在,但是没有细节,具体的细节交给不同的对象各自负责。如果相同的,就模板统一管理,这样,就能大程度上统一风格和复用。同时,具体的调用步骤,可以只调整模板,然后所有子类都会同意调整。
二、定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板角色:抽取公共方法,定义函数模板及调用步骤。
具体细节实现:实现具体细节。
三、示例
// 抽象类,实体类皆可,统一的抽象角色
public abstract class Game {
// 不同,需要具体角色具体实现细节
abstract void start();
abstract void end();
// 这里模板的提取的方法,可以改变此处实现,从而改变所有子类的步骤调用。
public void play(){
start();
end();
}
// 公用方法,每个具体角色实现都相同,直接抽取至模板
public void exit(){
System.out.println("退出游戏!!");
}
}
// 具体实现角色
public class FootBall extends Game {
@Override
void start() {
System.out.println("足球游戏开始!!");
}
@Override
void end() {
System.out.println("足球游戏结束!!");
}
}
// 具体实现角色
public class BasketBall extends Game {
@Override
void start() {
System.out.println("篮球游戏开始!!");
}
@Override
void end() {
System.out.println("篮球游戏结束!!");
}
}
public class TemplateApplication {
public static void main(String[] args) {
// 客户端调用
Game footBall = new FootBall();
Game basketBall = new BasketBall();
// 调用具体实现方法
footBall.play();
basketBall.play();
// 调用公共方法
footBall.exit();
basketBall.exit();
}
}
结果输出:
足球游戏开始!!
足球游戏结束!!
篮球游戏开始!!
篮球游戏结束!!
退出游戏!!
退出游戏!!
四、总结
优点:封装不变部分,封装不可变部分。提取公共代码。行为父类控制,子类实现。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)