背景
我方除了很多特机外,其实还需要一批专门送死的杂兵。这就要求杂兵机的造价不能太高。我们选择了亡灵工厂为我们生产这些杂兵机。
广告:亡灵工厂生产各种型号的亡灵机,这些亡灵机都在亡灵原型机的基础上改造,通过这样很好的降低了研发成本,同时亡灵机质量非常棒,能够抵抗10次重力炮的攻击。价格低廉,质量上乘,欢迎各战区大批采购,量大从优!
实现
亡灵原型机
/**
* 亡灵原型机:亡灵系列是亡灵工厂大规模生产的机体,以其价格低廉,质量上乘成为我方御用的杂兵供应商。
* 亡灵系列有很多种机型,每种型号的机体会对原型机进行强化。
* 举个例子:MKII2、MKII3、MKIIR、MKIIS都是该系列的机体
*/
public abstract class Ghost {
/**
* 不变的武器
*/
final void fireGun() {
System.out.println("火神炮!");
}
/**
* 不变的武器
*/
final void wrestle() {
System.out.println("格斗!");
}
/**
* 不变的武器
*/
final void stifleFist() {
System.out.println("亡灵压杀拳!");
}
/**
* 展示你的真正实力吧!
*/
final void showYourPower() {
if (needFireGun()) {
fireGun();
}
if (needWrestle()) {
wrestle();
}
if (needStifleFist()) {
stifleFist();
}
uniqueSkill();
}
/**
* 大招,有些后继机体都会有大招
*/
abstract void uniqueSkill();
/**
* 钩子函数:是否需要火神炮?
*/
boolean needFireGun() {
return true;
}
/**
* 钩子函数:是否需要格斗?
*/
boolean needWrestle() {
return true;
}
/**
* 钩子函数:是否需要亡灵压杀拳?
*/
boolean needStifleFist() {
return true;
}
}
亡灵MKII3
/**
* 亡灵MKII3:古铁的前辈
* 我都不需要原型机的垃圾武器..
*/
public class MKII3Ghost extends Ghost {
@Override
void uniqueSkill() {
System.out.println("左轮打桩机!");
}
@Override
boolean needFireGun() {
return false;
}
@Override
boolean needStifleFist() {
return false;
}
@Override
boolean needWrestle() {
return false;
}
}
亡灵MKIIS
/**
* 亡灵MKIIS:格斗机体
* 我只需要格斗类型的武器
*/
public class MKIISGhost extends Ghost {
@Override
void uniqueSkill() {
System.out.println("亡灵穿山腿!");
}
@Override
boolean needFireGun() {
return false;
}
}
亡灵MKIIR
/**
* 亡灵MKIIR:射击机体
* 我只需要射击类型的武器
*/
public class MKIIRGhost extends Ghost {
@Override
void uniqueSkill() {
System.out.println("重力冲击炮!");
}
@Override
boolean needStifleFist() {
return false;
}
@Override
boolean needWrestle() {
return false;
}
}
测试
public class Test {
public static void main(String[] args) {
System.out.println("MKII3:古铁的前辈");
Ghost ghost = new MKII3Ghost();
ghost.showYourPower();
System.out.println("---------");
System.out.println("MKIIS:纯格斗机体");
ghost = new MKIISGhost();
ghost.showYourPower();
System.out.println("---------");
System.out.println("MKIIR:纯射击机体");
ghost = new MKIIRGhost();
ghost.showYourPower();
System.out.println("---------");
}
}
测试结果
MKII3:古铁的前辈
左轮打桩机!
---------
MKIIS:纯格斗机体
格斗!
亡灵压杀拳!
亡灵穿山腿!
---------
MKIIR:纯射击机体
火神炮!
重力冲击炮!
---------
总结
模板抽象类提供不变的方法(如一个框架方法)和变化的方法(抽象方法,需子类重写),还提供了钩子函数(子类可决定是否重写),钩子函数常用来做判断。
读过Spring源码和AQS源码的小伙伴可以看出模板抽象方法的广泛使用。