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

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

提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历。在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。

一、 模板方法(Template Method)模式

模板方法模式——在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。

二、 模板方法模式的类图

模板方法模式中涉及了两个角色:

  • 抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
  • 具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。

三、 模板方法模式的实现

下面以生活中炒蔬菜为例来实现下模板方法模式。在现实生活中,做蔬菜的步骤都大致相同,如果我们针对每种蔬菜类定义一个烧的方法,这样在每个类中都有很多相同的代码,为了解决这个问题,我们一般的思路肯定是把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板方法的实现精髓所在,具体实现代码如下:

// 客户端调用

using System;

class Client
{
    static void Main(string[] args)
    {
        // 创建一个菠菜实例并调用模板方法
        var spinach = new Spinach();
        spinach.CookVegetabel();
        Console.Read();
    }
}

public abstract class Vegetabel
{
    // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序
    public void CookVegetabel()
    {
        Console.WriteLine("抄蔬菜的一般做法");
        this.PourOil();
        this.HeatOil();
        this.PourVegetable();
        this.stir_fry();
    }

    // 第一步倒油
    public void PourOil()
    {
        Console.WriteLine("倒油");
    }

    // 把油烧热
    public void HeatOil()
    {
        Console.WriteLine("把油烧热");
    }

    // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定
    public abstract void PourVegetable();

    // 开发翻炒蔬菜
    public void stir_fry()
    {
        Console.WriteLine("翻炒");
    }
}

// 菠菜
public class Spinach : Vegetabel
{

    public override void PourVegetable()
    {
        Console.WriteLine("倒菠菜进锅中");
    }
}

// 大白菜
public class ChineseCabbage : Vegetabel
{
    public override void PourVegetable()
    {
        Console.WriteLine("倒大白菜进锅中");
    }
}

在上面的实现中,具体子类中重写了导入蔬菜种类的方法,因为这个真是烧菜方法中不同的地方,所以由具体子类去实现它。

四、 模板方法模式的优缺点

优点:

  1. 实现了代码复用
  2. 能够灵活应对子步骤的变化,符合开放-封闭原则

缺点:

  1. 因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。

附:在.NET中模板方法的应用也很多,例如我们在开发自定义的Web控件或WinForm控件时,我们只需要重写某个控件的部分方法。

五、 总结

到这里,模板方法的介绍就结束了,模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术

转载于:https://www.cnblogs.com/guyun/p/6187733.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java虚拟机学习笔记——方法的调用与返回(第19章 )
  • Linux下eclipse提示快捷键失效解决办法
  • 从jvm运行机制来分析String对象
  • 轮播图-JavaScript
  • JVM的常量池
  • hdu 5997 rausen loves cakes(线段数合并+启发式修改)
  • 算法导论学习笔记——散列表
  • 百度网盘生成二维码api
  • 算法导论学习笔记——二叉查找树
  • win10安装blueCFD
  • 算法导论学习笔记——红黑树
  • 理解Linux文件系统
  • 沙盒SandBox
  • Python数据类型间互转(字典、字符串、列表、元组)
  • 输入n个整数,输出其中最小的k个
  • DataBase in Android
  • Debian下无root权限使用Python访问Oracle
  • Druid 在有赞的实践
  • happypack两次报错的问题
  • JavaScript函数式编程(一)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • mysql常用命令汇总
  • Spring Boot MyBatis配置多种数据库
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 规范化安全开发 KOA 手脚架
  • 实战|智能家居行业移动应用性能分析
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (实战篇)如何缓存数据
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET企业级应用架构设计系列之应用服务器
  • .pop ----remove 删除
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [51nod1610]路径计数
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BJDCTF2020]The mystery of ip
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [iOS]-NSTimer与循环引用的理解
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [LeeCode]-Divide Two Integers 不用乘除的除法运算
  • [leetcode]max-consecutive-ones 最大连续1的个数
  • [luogu P1527]矩阵乘法(矩形k小)
  • [Mac软件]Goldie App v2.2 Mac黄金比例设计工具