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


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

    一、概念

    动机:

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

    解决方法:

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

    缘由:

    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();
            }
    
        }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    CrossFileGame .cs

     /// 
        /// 穿越火线游戏类
        /// 
        public class CrossFileGame : Game
        {
            public override void InitGame()
            {
                Console.WriteLine("初始化穿越火线游戏..");
            }
    
            public override void StartGame()
            {
                Console.WriteLine("开始穿越火线游戏..");
            }
    
            public override void EndGame()
            {
                Console.WriteLine("结束穿越火线游戏..");
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    YXLMGame .cs

     /// 
        /// 英雄联盟游戏类
        /// 
        public class YXLMGame : Game
        {
            public override void InitGame()
            {
                Console.WriteLine("初始化英雄联盟游戏..");
            }
            public override void StartGame()
            {
                Console.WriteLine("开始英雄联盟游戏..");
            }
            public override void EndGame()
            {
                Console.WriteLine("结束英雄联盟游戏..");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    /// 
        /// 游戏主循环类
        /// 
        class Program
        {
            static void Main(string[] args)
            {
                Game yxmlGame = new YXLMGame();
                yxmlGame.Play();
                Console.WriteLine();
    
                Game cfGame = new CrossFileGame();
                cfGame.Play();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果:
    在这里插入图片描述

    三、类图关系

    类的实现关系如图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S89tYb2x-1660155189471)(C:\Users\JackiieWang\AppData\Roaming\Typora\typora-user-images\image-20220811020937339.png)]

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

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

    在这里插入图片描述

    作者:ProMer_Wang

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

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

  • 相关阅读:
    基本程序单元Activity
    GBase 8c使用DMT更新表数据(一)
    QTday06(人脸识别项目前置知识)
    y120.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(六)
    JAVA面试
    统计指定字符串中每个单词出现的次数(C++)
    微服务学习第四十四节 Sentinel整合GateWay
    【推荐系统】:协同过滤和基于内容过滤概述
    面试算法36:后缀表达式
    【MySQL 数据库 基础】基础sql语句
  • 原文地址:https://blog.csdn.net/qq_43801020/article/details/126277540