首页 > 编程语言 >C# 设计模式之模板方法模式

C# 设计模式之模板方法模式

时间:2024-08-08 19:25:12浏览次数:12  
标签:C# 子类 实现 步骤 设计模式 方法 public 模板

总目录


前言

在日常的工作中,有时候我们做PPT,做合同,做简历,如果我们自己从头去写这些文档,不免有些太过耗时耗力;大多时候都是去找相关的PPT模板,合同模板,简历模板,拿过来直接用。为什么可以使用模板,因此这些资料大部分的信息和信息框架都是一致的,我们只需要将自己差异化的内容填写进去就可以,模板的作用就是将公有的格式,框架,信息提取出来都做好,使用模板的人只需填写个人差异化的信息即可。模板方法设计模式就是按照这个思想来设计代码的,在软件构建过程中,对于某一项任务,如果它常常有稳定的整体操作结构,但各个子步骤内却有很多改变的需求,这个时候就可以应用模板方法模式。


1 基础介绍

  1. 定义:定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。
  2. 定义解释:在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到基类中,从而去除了子类中的重复代码。
  3. 模板方法模式中的角色:
    • 抽象类角色(AbstractClass):定义一个模板方法(TemplateMethod),在该方法中包含着一个算法的骨架,具体的算法步骤是PrimitiveOperation1方法和PrimitiveOperation2方法,该抽象类的子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。
    • 具体类角色(ConcreteClass):实现PrimitiveOperation1方法和PrimitiveOperation2方法以完成算法中与特定子类(Client)相关的内容。
  4. 模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。

2 使用场景

适用于 某个功能需要多个步骤实现,整体的实现步骤是不变的,只是具体的某些子步骤会存在差异的情况,这样就可以将实现步骤提取到基类,具体的实现交给实现类去完成。

3 实现方式

在C#中,使用模板方法的关键是要定义一个抽象类AbstractClass,它包含了一个模板方法TemplateMethod,该方法包含所有的算法流程,但某些步骤需要由子类来具体实现。因此,在抽象类中,通常会定义一些虚方法,用于在子类中具体实现算法:

    public abstract class AbstractClass
    {
        public void TemplateMethod()
        {
            // 模板方法,定义算法骨架  
            //步骤1
            PrimitiveOperation1();
            //步骤2
            PrimitiveOperation2();
            //步骤3
            PrimitiveOperation3();
            // ...  
        }

        // 步骤1(原始操作1):抽象方法,由子类具体实现
        public abstract void PrimitiveOperation1(); 

        //步骤2(原始操作2):抽象方法,由子类具体实现
        public abstract void PrimitiveOperation2();

        //步骤3(原始操作2):抽象方法,由子类具体实现
        public virtual void PrimitiveOperation3()
        {
            //在这里这里写上基类会有的基本操作
            Console.WriteLine("AbstractClass:base Operation3");
            //也可以什么都不写,默认实现为空,交由子类重写
        }

    }

在抽象类中,定义了一个模板方法TemplateMethod(),其中具体的算法流程已经定义好了,但某些步骤则需要由子类来具体实现,因此,在抽象类中,对于某些需要具体实现的步骤,我们使用抽象方法进行声明,在子类中需要对这些抽象方法进行具体实现;而对于某些步骤,它们的实现可以在基类中进行默认实现,因此,我们可以使用虚方法进行声明,在子类中也可以选择覆盖这些虚方法。

然后,创建两个继承自AbstractClass的具体类,实现这些抽象方法:

    public class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassA: PrimitiveOperation1");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassA: PrimitiveOperation2");
        }
    }

    public class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("ConcreteClassB: PrimitiveOperation1");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("ConcreteClassB: PrimitiveOperation2");
        }
		
		// 这里基于virtual方法重写,并加上自有的代码
        public override void PrimitiveOperation3()
        {
            base.PrimitiveOperation3();
            Console.WriteLine("ConcreteClassB: PrimitiveOperation3");
        }
    }

客户端调用:

        static void Main(string[] args)
        {
            AbstractClass abstractClass = new ConcreteClassA();
            
            // 调用TemplateMethod方法,
            //该方法会依次调用ConcreteClassA实现类中的各个实现方法
            abstractClass.TemplateMethod();
 
            abstractClass = new ConcreteClassB(); 
            
            // 再次调用TemplateMethod方法,这次会使用ConcreteClassB的实现。
            abstractClass.TemplateMethod();

            Console.ReadKey();

        }

4 优缺点分析

  • 优点

    • 使用模板方法可以使得代码的重复度降低,代码得到复用
    • 能够灵活应对子步骤的变化,符合开放-封闭原则
  • 缺点

    • 由于引入了一个抽象类,使程序代码变得复杂化

结语

希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
C#设计模式14——模板方法的写法
C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】
C#设计模式(14)——模板方法模式(Template Method)
使用 C# 实现23种常见的设计模式

标签:C#,子类,实现,步骤,设计模式,方法,public,模板
From: https://blog.csdn.net/qq_39847278/article/details/141019731

相关文章

  • C# 设计模式之代理模式
    总目录前言其实代理模式,在生活中无处不在;就比如租房,一般都是通过中介或者第三方的App去租房子(此处默认他们都是诚信友好的哈),那么为什么我们不自己找房子呢?租过房子应该都知道,自己找房子太麻烦了,既要找原房东,又要搞合同,出了问题扯皮也扯不清等等一些问题,主要是费时费力。......
  • 2024睿抗机器人开发者大赛(RAICOM) CAIP编程技能赛 国一
    最后91分,国一。前几题都AK了,最后一题先是输出0,得了个1分。花了一个小时都没解决这题,难受ing,其实到最后差不多要改对了(降落那一部分没时间改),但是没时间了,hhhh。拿到国一,简直圆梦啦!!!本科拿的国三,差0.02秒就是国二,从此内心蒙上阴影。哭死ing研一终于拿了个编程比赛的国一,也算......
  • MIMIC IV 3.0数据库安装方法
            MIMICIV3.0在上月已经发布了,那么如何安装这个最新的MIMIC数据库呢?1.MIMICIV3.0数据库变化情况        2024年7月19日,知名医疗数据库MIMIC-IV发布了最新的3.0版本,此次更新为数据库带来了诸多重要改进和新增数据。此次更新最显著的变化是新增了20......
  • [Typescript] The declare module Syntax in TypeScript
    Herewe'reimportingafunction myModuleFunc from my-module:import{myModuleFunc}from"my-module";//redsquigglylineunder"my-module" Let'sstartbycreatinganewdeclarationfilecalled my-module.d.ts insideofth......
  • c语言中输出字符指针相关问题
    原文链接:https://blog.csdn.net/littesss/article/details/71037908c语言中输出字符指针相关问题一、例如定义一个char*p="hello";的字符指针。首先搞清楚在c语言中没有字符串的类型,所以对字符串操作,有两种形式:可以用字符指针(为什么不叫字符串指针,我个人觉得,字符指针针对......
  • 基于SiliconCloud快速体验GraphRag.Net
    SiliconCloud介绍SiliconCloud基于优秀的开源基础模型,提供高性价比的GenAI服务。不同于多数大模型云服务平台只提供自家大模型API,SiliconCloud上架了包括Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA3、SDXL、InstantID在内的多种开源大语言模型及图片生成模型,用户可自由切......
  • [Typescript] tsconfig libs and target
    Intsconfigfile,youhave targetand libsconfiguration.Youalwaysneedtodefinea target,recommendedas es2022Specifyingthe lib optionalsoletsusdrilldownintothespecificfeaturesandlibrarieswewanttoincludeinourproject,whichwewill......
  • 暑假集训CSP提高模拟16
    1.九次九日九重色一开始做的时候被题面给迷惑住了,没想到可以跳着匹配(样例太水)。那我们来考虑如何做,首先思路肯定是把能匹配的暴力求出来,根据不知道怎么搞的调和计数,这样的复杂度还不是很高,是\(O(NlogN)\),可以搞。观察一下预处理出来的序列,是不是很熟悉。没错剩下的就是求最......
  • C数组和指针,从此不再困惑。
    目录一、思考下图中的问题?二、上图中问题答案,如下图:三、分析问题答案1、分析前知识准备1.0、内存区术语1.1、为什么定义数组类型变量时要指定大小或初始化1.2、指针指向的内存一定是在堆区吗?1.3、const关键字的思考1.4、进程虚拟地址空间1.5、为什么会段错误?2、开始......
  • Spring Cloud微服务项目聚合Swagger文档
            在微服务架构中,每个服务通常都有自己独立的API文档。为了方便管理和查看所有服务的接口文档,我们需要将这些文档进行聚合。SpringCloud与Swagger的结合可以帮助我们实现这一目标。本文将介绍如何在SpringCloud微服务项目中聚合Swagger文档,以便于集中......