模板方法模式详解
序言
已经很久没有写设计模式了。额。。。
本来还想着能多看一点设计模式总结一下呢,然后转眼已经马上要到2018了。有点尴尬啊。
不过也算有收获,毕竟看了别的书籍,也看了一部分Spring的源码,看起来真是晦涩难懂啊。。。
这次写这个模板方法模式也是基于看书过程中的一些契机的,那就是同步锁的一些依赖实现——队列同步器。
队列同步器的设置是基于模板设计模式的。
模板设计模式的实现过程
应用背景:
由于本人是也算是个游戏迷,那就以今年的一款现象级游戏吃鸡(绝地求生)来讲解这个模板设计模式吧。
这个游戏想要成为吃鸡(最后的生存者)一般需要经历以下几个步骤:匹配到玩家、跳伞、捡垃圾、跑毒圈、吃鸡。
上述步骤中:吃鸡都是相对固定的步骤了、而匹配到玩家、跳伞、捡垃圾、跑毒圈就是存在可变性的步骤。
好的背景就是这样,我们的目的是吃鸡、上面五个步骤就是我们吃鸡的整个过程。
实际上,吃鸡这个游戏的核心就在跑毒圈这个这个过程中。其他过程我们是可以不用太关注的,而吃鸡是需要上述过程按照顺序排列才能够实现的,也就是说顺序也是固定的,那么我们这样设计模型:
public abstract class ChijiModel {
//默认服务器下匹配玩家
protected abstract void match();
//跳伞,小心落地成盒啊
protected abstract void jump();
//捡垃圾,不好意思你看到我的98k了吗
protected abstract void pick();
//跑毒圈,你有千万种跑法
protected abstract void run();
//开启强制吃鸡模式
protected boolean isChiji() {
return true;
}
//大吉大利今晚吃鸡/快递员
final public void chiji() {
this.match();
this.jump();
this.pick();
this.run();
if(isChiji()) {
System.out.println("大吉大利今晚吃鸡");
} else {
System.out.println("化身快递员");
}
}
}
构建两个玩家模型:
public class GodV extends ChijiModel {
@Override
protected void match() {
System.out.println("亚服匹配玩家");
}
@Override
protected void jump() {
System.out.println("跳伞哪人都我去哪");
}
@Override
protected void pick() {
System.out.println("我再也不想用ak了");
}
@Override
protected void run() {
System.out.println("开车按喇叭,手榴弹随便扔");
}
@Override
protected boolean isChiji() {
//强制吃鸡不存在的,godV开始了
return false;
}
}
public class Aab extends ChijiModel {
//神奇帮助肯定能够吃鸡
private boolean chijiFlag = true;
@Override
protected void match() {
System.out.println("随便哪个服务器都是虐");
}
@Override
protected void jump() {
System.out.println("看你们落地成盒");
}
@Override
protected void pick() {
System.out.println("武器随便挑,8倍镜随便压");
}
@Override
protected void run() {
System.out.println("哎,mff我们去把那伙人打死");
}
@Override
protected boolean isChiji() {
System.out.println("开启神仙吃鸡模式");
return chijiFlag;
}
}
让玩家开始吃鸡:
public class PB {
public static void main(String[] args) {
GodV reverse = new GodV();
Aab ugly = new Aab();
reverse.chiji();
System.out.println("------------------");
ugly.chiji();
}
}
结果:
概念:
模板方法模式包含两个角色:
抽象类:
用于定义一系列基本操作,有具体的也有抽象的。每一个基本操作相当于一个算法步骤,在抽象类中也有一个模板方法,是实现定义算法步骤的框架的。
具体子类:
实现父类的抽象算法过程,也可以重写具体算法过程。
模板方法:
聚合整个算法步骤的框架。是一个具体的方法。
在例子中的吃鸡明显就属于该方法
抽象方法:
在抽象类中没有实现,在子类中实现的方法,属于基本方法。
具体方法:
在抽象类中实现了的方法,属于基本方法。
钩子方法:
在抽象类中有实现,子类可以重写,属于基本方法。
TemplateMethod()就是模板方法,operation1与operation2就是基本方法。
模板方法是通过汇总或排序基本方法产生的结果集。
模板方法模式:
就是按照一个规则和顺序调用基本方法。
具体到我们的例子中去:就是按照chiji()方法规定的顺序调用本类的其他方法。
实际上你可以通过修改子类的实现来达到修改父类结果的效果。
本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。
如果喜欢的话点一波推荐吧,谢谢了。