C#设计模式详解(1)——Template Method(模板方法)

C#设计模式(1)——Template Method(模板方法)

一、概念

动机:

在软件的构建过程中,对于某一项任务,他常常有稳定的整体操作结构,但是各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现

解决方法:

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。

缘由:

Template Method 是的子类可以不改变(复用)一个算法的接口即可重定义(overrider)该算法的某些特定步骤

应用场景:

通过以上的描述实质上,其实类模板方法这种设计模式说白了就是抽出其他类的共性,但是前提是我们需要根据需求的实现来选择是否通过这种设计模式来实现。假设我们的需求只会用到一个类的实现步骤以及实现过程,那我们就没有必要选择一开始就通过模板方法的方式来做。设计模式的要义在于我们只有在做到需求变化的同时,现有的功能逻辑以及不符合变化的需求了,我们才会考虑去利用设计模式来减少繁杂的代码。

之前有在一个博客上看到过一篇文章,忘记是哪位博主发的了,大概的步骤就是将一个游戏的实现固有步骤通过模板方法的方式来做;

二、代码案例

Game.cs
抽象游戏类

 	/// <summary>
    /// 抽象游戏类
    /// </summary>
    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

 /// <summary>
    /// 穿越火线游戏类
    /// </summary>
    public class CrossFileGame : Game
    {
        public override void InitGame()
        {
            Console.WriteLine("初始化穿越火线游戏..");
        }

        public override void StartGame()
        {
            Console.WriteLine("开始穿越火线游戏..");
        }

        public override void EndGame()
        {
            Console.WriteLine("结束穿越火线游戏..");
        }

    }

YXLMGame .cs

 /// <summary>
    /// 英雄联盟游戏类
    /// </summary>
    public class YXLMGame : Game
    {
        public override void InitGame()
        {
            Console.WriteLine("初始化英雄联盟游戏..");
        }
        public override void StartGame()
        {
            Console.WriteLine("开始英雄联盟游戏..");
        }
        public override void EndGame()
        {
            Console.WriteLine("结束英雄联盟游戏..");
        }
    }
/// <summary>
    /// 游戏主循环类
    /// </summary>
    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)]

看到类图我们发现,我们在实现该流程的时候我们主要是将两个游戏中的共性交由Game抽象类来处理,同时我们也将固有的相同步骤交由抽象类来调用;

而此时就呼应了 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中这一过程;

在这里插入图片描述

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

在这里插入图片描述

作者:ProMer_Wang

链接:https://blog.csdn.net/qq_43801020/article/details/126277540

本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值