发布时间:2016-11-30责任编辑:朱明 浏览:1473
一、 模式简介
定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤。
模板方法模式(Template Method)结构图:
AbstractClass是一个抽象模板类,在它的内部定义并实现了一个模板方法,它给出了一个顶级逻辑的骨架,而其中逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。当然,在顶级逻辑中也有可能会调用一些具体方法。
ConcreteClass是一个具体子类,负责实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应。而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
二、在游戏开发中的应用
接下来结合我们的《战国跑酷》游戏项目,谈一谈模板方法模式的实际应用。
新手引导,是每个游戏都必不可少的功能模块,它在新用户第一次进入游戏时,给予引导,帮助玩家快速上手游戏。进入新手引导后,通常都会打开一个用于引导的界面,在界面中会存在引导点击的高亮区域或是文字说明等内容,当玩家按照引导操作之后,便会关闭当前的引导界面,跳转到下一个新引导界面,从而一步步的进行下去。我们在制作新手引导的过程中,对于每一个步骤,处理的顶层逻辑基本都是一样的,顶层逻辑的骨架如下:
Step 1:关闭当前界面;
Step 2 : 打开下一个界面;
Step 3 : 显示下一个界面自身的引导内容;
Step 4 : ...
针对上述情况,模板方法模式便可以发挥它的优势,将重复操作放在父类之中,而将特殊的操作步骤延迟到子类实现,从而实现代码的复用。
定义抽象新手引导类
public abstract class NoviceGuide
{
public void GuideOperation()//模板方法
{
CloseCurrentView();//通用方法,关闭当前界面
OpenNextView();//通用方法,打开下一界面
PrimativeOperation();//抽象方法,显示界面自身内容,在具体子类中实现
}
public void CloseCurrentView();
public void OpenNextView();
public abstract void PrimativeOperation();
}
定义具体实现子类1
public class NoviceGuideStep1
{
public override void PrimativeOperation()
{
//处理步骤1需要展示的内容
}
}
定义具体实现子类2
public class NoviceGuideStep2
{
public override void PrimativeOperation()
{
//处理步骤2需要展示的内容
}
}
这样一来,重复的代码被提取到父类之中,而我们只需要在具体的子类中添加对应的处理就可以了。模板方法模式提供了一个很好的代码复用方式,我们通过把这些重复的行为搬移到单一的地方,这样就能帮助子类摆脱重复的不变行为。模板方法模式是比较常用的模式,像在.net的类库设计中,通常都会利用模板方法模式提取类库中的公共行为到抽象类中。
战国工作室 供稿