动机:
在软件的构建过程中,对于某一项任务,他常常有稳定的整体操作结构,但是各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现
解决方法:
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。
缘由:
Template Method 是的子类可以不改变(复用)一个算法的接口即可重定义(overrider)该算法的某些特定步骤
应用场景:
通过以上的描述实质上,其实类模板方法这种设计模式说白了就是抽出其他类的共性,但是前提是我们需要根据需求的实现来选择是否通过这种设计模式来实现。假设我们的需求只会用到一个类的实现步骤以及实现过程,那我们就没有必要选择一开始就通过模板方法的方式来做。设计模式的要义在于我们只有在做到需求变化的同时,现有的功能逻辑以及不符合变化的需求了,我们才会考虑去利用设计模式来减少繁杂的代码。
之前有在一个博客上看到过一篇文章,忘记是哪位博主发的了,大概的步骤就是将一个游戏的实现固有步骤通过模板方法的方式来做;
Game.cs
抽象游戏类
///
/// 抽象游戏类
///
public abstract class Game
{
//每款游戏都要投币,子类不能重写(该部分为稳定的模块)
public void InsertCoins()
{
Console.WriteLine("往游戏机里面投币...");
}
public abstract void InitGame();
public abstract void StartGame();
public abstract void EndGame();
public void Play()
{
//投币
InsertCoins();
//初始化游戏
InitGame();
//开始游戏
StartGame();
//游戏结束
EndGame();
}
}
CrossFileGame .cs
///
/// 穿越火线游戏类
///
public class CrossFileGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化穿越火线游戏..");
}
public override void StartGame()
{
Console.WriteLine("开始穿越火线游戏..");
}
public override void EndGame()
{
Console.WriteLine("结束穿越火线游戏..");
}
}
YXLMGame .cs
///
/// 英雄联盟游戏类
///
public class YXLMGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化英雄联盟游戏..");
}
public override void StartGame()
{
Console.WriteLine("开始英雄联盟游戏..");
}
public override void EndGame()
{
Console.WriteLine("结束英雄联盟游戏..");
}
}
///
/// 游戏主循环类
///
class Program
{
static void Main(string[] args)
{
Game yxmlGame = new YXLMGame();
yxmlGame.Play();
Console.WriteLine();
Game cfGame = new CrossFileGame();
cfGame.Play();
}
}
运行结果:

类的实现关系如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S89tYb2x-1660155189471)(C:\Users\JackiieWang\AppData\Roaming\Typora\typora-user-images\image-20220811020937339.png)]](https://1000bd.com/contentImg/2022/08/14/190259986.png)
看到类图我们发现,我们在实现该流程的时候我们主要是将两个游戏中的共性交由Game抽象类来处理,同时我们也将固有的相同步骤交由抽象类来调用;
而此时就呼应了 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中这一过程;

作者:ProMer_Wang
链接:https://blog.csdn.net/qq_43801020/article/details/126277540
本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!