定义
在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤。
使用场景
- 有多个子类共有的方法,且逻辑相同。
-
UML
角色结构
优点
封装不变部分,扩展可变部分。
- 提取公共代码,便于维护。
-
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
业务场景
打不同的游戏流程都是一样的,先打开打开游戏,然后玩游戏,最后结束游戏,但是打游戏的内容是不一样的。
代码示例
Game 游戏抽象类
public abstract class Game {
abstract void login();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play(){
//初始化游戏
login();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
LOL 英雄联盟实现类
public class LOL extends Game {
@Override
void endPlay() {
System.out.println("垃圾队友,带不动我,下线");
}
@Override
void login() {
System.out.println("LOL 上号");
}
@Override
void startPlay() {
System.out.println("开心的打晋级赛");
}
}
DNF 毒奶粉实现类
public class DNF extends Game {
@Override
void endPlay() {
System.out.println("垃圾游戏 又是光头 下线");
}
@Override
void login() {
System.out.println("dnf 上号");
}
@Override
void startPlay() {
System.out.println("开心的刷深渊");
}
}
Client
public class Client {
public static void main(String[] args) {
Game game = new LOL();
game.play();
System.out.println();
game = new DNF();
game.play();
}
}
输出
```java LOL 上号 开心的打晋级赛 垃圾队友,带不动我,下线
dnf 上号 开心的刷深渊 垃圾游戏 又是光头 下线 ```