Java~设计模式之模板方法模式 || 我是标准,你必须按我的来
程序员文章站
2022-04-23 15:07:38
文章目录模板方法模式实现模板方法模式定义:在模板模式方法中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。关键:在抽象类定义模板,子类按模板执行。优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。缺点:每一个不同的...
模板方法模式
- 定义:在模板模式方法中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
- 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 关键:在抽象类定义模板,子类按模板执行。
- 优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
- 缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
- 使用: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
- 注意:为防止恶意操作,一般模板方法都加上 final 关键词。
- 举例: 比如我们在玩任何游戏的时候,步骤都是一样的, 先下载安装, 然后开始游戏,最后结束游戏, 那么我们就可以给这个步骤定义一个模板方法,让任何一款游戏在开始玩之前都可以按这个步骤进行开始
实现
- 定义抽象的游戏模板
abstract class GameTemplate {
protected String username;
public GameTemplate(String username) {
this.username = username;
}
/*
加载游戏
*/
abstract public void init();
/*
开始游戏
*/
abstract public void begin();
/*
结束游戏
*/
abstract public void end();
/*
模板方法,被final修饰, 但是不可与abstract同时修饰,意义会冲突
其可以被继承, 但是不可以进行重写扩展
*/
final public void templateMethod() {
/*
要修改必须在定义这个方法原始地方修改
*/
this.init();
this.begin();
this.end();
}
}
- 实现三个游戏
class LOL extends GameTemplate {
public LOL(String username) {
super(username);
}
@Override
public void init() {
System.out.println(username + "下载了LOL");
}
@Override
public void begin() {
System.out.println(username + "开始LOL");
}
@Override
public void end() {
System.out.println(username + "结束LOL");
}
}
class CF extends GameTemplate {
public CF(String username) {
super(username);
}
@Override
public void init() {
System.out.println(username + "下载了CF");
}
@Override
public void begin() {
System.out.println(username + "开始CF");
}
@Override
public void end() {
System.out.println(username + "结束CF");
}
}
class DOTA extends GameTemplate {
public DOTA(String username) {
super(username);
}
@Override
public void init() {
System.out.println(username + "下载了DOTA");
}
@Override
public void begin() {
System.out.println(username + "开始DOTA");
}
@Override
public void end() {
System.out.println(username + "结束DOTA");
}
}
- 客户端
public class Template {
public static void main(String[] args) {
GameTemplate lol = new LOL("listen");
GameTemplate cf = new CF("james");
GameTemplate dota = new DOTA("kobe");
lol.templateMethod();
System.out.println("*");
cf.templateMethod();
System.out.println("*");
dota.templateMethod();
}
}
- 测试结果
本文地址:https://blog.csdn.net/Shangxingya/article/details/109922724