当前位置: 首页 > news >正文

23种设计模式之《模板方法模式(Template Method)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种:

1. 创建型模式(Creational Patterns)

  • 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。

  • 工厂方法模式(Factory Method):定义创建对象的接口,由子类决定实例化哪个类。

  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。

  • 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。

  • 原型模式(Prototype):通过复制现有对象来创建新对象。

2. 结构型模式(Structural Patterns)

  • 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。

  • 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。

  • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。

  • 装饰器模式(Decorator):动态地给对象添加职责,相比生成子类更为灵活。

  • 外观模式(Facade):为子系统中的一组接口提供一个统一的接口。

  • 享元模式(Flyweight):通过共享技术有效地支持大量细粒度对象。

  • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

3. 行为型模式(Behavioral Patterns)

  • 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者与接收者耦合。

  • 命令模式(Command):将请求封装为对象,使你可以用不同的请求对客户进行参数化。

  • 解释器模式(Interpreter):给定一个语言,定义其文法的一种表示,并定义一个解释器。

  • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示。

  • 中介者模式(Mediator):定义一个中介对象来封装一系列对象之间的交互。

  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

  • 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知并自动更新。

  • 状态模式(State):允许对象在其内部状态改变时改变其行为。

  • 策略模式(Strategy):定义一系列算法,将它们封装起来,并使它们可以互相替换。

  • 模板方法模式(Template Method):定义一个操作中的算法骨架,将一些步骤延迟到子类中。

  • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

4.模板方法模式(Template Method Pattern)解释

模板方法模式是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式的核心思想是将算法的通用部分放在父类中,而将可变的部分留给子类去实现。

模板方法模式的主要组成部分包括:

  1. 抽象类(Abstract Class)​:定义了一个模板方法,该方法包含了算法的骨架。模板方法通常会调用一些抽象方法或钩子方法,这些方法由子类实现。
  2. 具体类(Concrete Class)​:实现了抽象类中的抽象方法或钩子方法,从而具体化了算法的某些步骤。

模板方法模式的关键在于:​父类控制算法的流程,子类实现具体的步骤。这种方式可以避免代码重复,并且使得算法的扩展更加灵活。


5.C# 实现模板方法模式的演示代码

 

csharp

using System;// 抽象类:定义模板方法和算法的骨架
public abstract class AbstractClass
{// 模板方法:定义了算法的流程public void TemplateMethod(){Step1();Step2();Step3();HookMethod(); // 钩子方法,子类可以选择是否重写}// 具体步骤1:抽象方法,子类必须实现protected abstract void Step1();// 具体步骤2:抽象方法,子类必须实现protected abstract void Step2();// 具体步骤3:默认实现,子类可以选择是否重写protected virtual void Step3(){Console.WriteLine("AbstractClass: Default implementation of Step3");}// 钩子方法:默认实现,子类可以选择是否重写protected virtual void HookMethod(){Console.WriteLine("AbstractClass: Default implementation of HookMethod");}
}// 具体类A:实现抽象类中的抽象方法
public class ConcreteClassA : AbstractClass
{protected override void Step1(){Console.WriteLine("ConcreteClassA: Step1");}protected override void Step2(){Console.WriteLine("ConcreteClassA: Step2");}// 重写Step3,提供自定义实现protected override void Step3(){Console.WriteLine("ConcreteClassA: Custom implementation of Step3");}// 重写钩子方法,提供自定义实现protected override void HookMethod(){Console.WriteLine("ConcreteClassA: Custom implementation of HookMethod");}
}// 具体类B:实现抽象类中的抽象方法
public class ConcreteClassB : AbstractClass
{protected override void Step1(){Console.WriteLine("ConcreteClassB: Step1");}protected override void Step2(){Console.WriteLine("ConcreteClassB: Step2");}// 不重写Step3,使用默认实现// 不重写HookMethod,使用默认实现
}// 客户端代码
class Program
{static void Main(string[] args){Console.WriteLine("Client: Testing ConcreteClassA");AbstractClass classA = new ConcreteClassA();classA.TemplateMethod();Console.WriteLine("\nClient: Testing ConcreteClassB");AbstractClass classB = new ConcreteClassB();classB.TemplateMethod();}
}

6.代码说明

  1. 抽象类(AbstractClass)​

    • 定义了模板方法 TemplateMethod,它包含了算法的骨架。
    • 包含两个抽象方法 Step1 和 Step2,子类必须实现。
    • 包含一个默认实现的方法 Step3,子类可以选择是否重写。
    • 包含一个钩子方法 HookMethod,子类可以选择是否重写。
  2. 具体类A(ConcreteClassA)​

    • 实现了抽象方法 Step1 和 Step2
    • 重写了 Step3 和 HookMethod,提供了自定义实现。
  3. 具体类B(ConcreteClassB)​

    • 实现了抽象方法 Step1 和 Step2
    • 没有重写 Step3 和 HookMethod,使用默认实现。
  4. 客户端代码

    • 创建了 ConcreteClassA 和 ConcreteClassB 的实例,并调用它们的 TemplateMethod,展示了不同子类的行为。

7.运行结果

Client: Testing ConcreteClassA
ConcreteClassA: Step1
ConcreteClassA: Step2
ConcreteClassA: Custom implementation of Step3
ConcreteClassA: Custom implementation of HookMethodClient: Testing ConcreteClassB
ConcreteClassB: Step1
ConcreteClassB: Step2
AbstractClass: Default implementation of Step3
AbstractClass: Default implementation of HookMethod

8.总结

模板方法模式通过将算法的框架放在父类中,而将具体步骤的实现交给子类,实现了代码的复用和扩展性。它的主要优点包括:

  1. 代码复用:算法的通用部分在父类中实现,避免了代码重复。
  2. 扩展性:子类可以灵活地实现或重写某些步骤,而不需要修改算法的整体结构。
  3. 控制流程:父类控制算法的流程,子类只需关注具体的实现细节。

模板方法模式常用于框架设计、算法实现等场景,例如在开发库或框架时,可以为用户提供一个可扩展的算法模板。

http://www.lryc.cn/news/546909.html

相关文章:

  • DEV-C++ 为什么不能调试?(正确解决方案)
  • 【C++设计模式】第五篇:原型模式(Prototype)
  • 深入 Vue.js 组件开发:从基础到实践
  • maven导入spring框架
  • 数据守护者:备份文件的重要性与自动化实践策略
  • MyBatis @Param 注解详解:指定的参数找不到?
  • 【项目日记(八)】内存回收与联调
  • 性能测试监控工具jmeter+grafana
  • 016.3月夏令营:数理类
  • CS144 Lab Checkpoint 0: networking warm up
  • 靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
  • 给没有登录认证的web应用添加登录认证(openresty lua实现)
  • 3月5日作业
  • 【MySQL】增删改查
  • 【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成
  • 线反转法实现矩形键盘按键识别
  • 在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值
  • 大白话面试中应对自我介绍
  • Pytorch构建LeNet进行MNIST识别 #自用
  • 元宇宙崛起:区块链与金融科技共绘数字新世界
  • React Native 实现滑一点点内容区块指示器也滑一点点
  • 怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载
  • 全国青少年航天创新大赛各项目对比分析
  • 基于RAG的法律条文智能助手
  • 智能对讲机:5G+AI赋能下的石油工业新“声”态
  • leetcode日记(77)子集Ⅱ
  • Linux tar命令
  • 【nodeJS】服务端连接mysql、定义一个接口,并在前端调用
  • 驱动开发系列40 - Linux 显卡KMD驱动代码分析(一) - 设备初始化过程
  • 玩转大语言模型——Ubuntu系统环境下使用llama.cpp进行CPU与GPU混合推理deepseek