详解C#设计模式编程中的模板方法模式使用

 更新时间:2016年02月24日 09:50:08   作者:learninghard  
这篇文章主要介绍了C#设计模式编程中的模板方法模式,模板方法模式比较好理解,即设定好算法骨架以后进行代码的反复利用,需要的朋友可以参考下

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

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

2.2 模板方法模式的实现
在这里以实现一个公司的薪资系统为例介绍一下模板方法的应用。
首先定义抽象类,一般建议将抽象的操作定义为非虚public方法,将子类需要定义的特定步骤定义为抽象的protected方法。

publicabstractclass Employee
 {
publicvoid GetSalary()
  {
   GetBasicSalary();
   AddBonus();
  }

protectedabstractvoid GetBasicSalary();
protectedabstractvoid AddBonus();
 }

接着分别实现经理和CEO的薪资

publicclass Manager : Employee
 {
protectedoverridevoid GetBasicSalary()
  {
   Console.WriteLine("Get Manager Basic Salary");
  }

protectedoverridevoid AddBonus()
  {
   Console.WriteLine("Add Manager Bonus");
  }
 }

publicclass CEO : Employee
 {
protectedoverridevoid GetBasicSalary()
  {
   Console.WriteLine("Get CEO Basic Salary");
  }

protectedoverridevoid AddBonus()
  {
   Console.WriteLine("Add CEO Bonus");
  }
 }

2.3 模板方法模式的结构图
模板方法是一种常见的设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法的结构图如下

201622494757547.jpg (457×258)

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

(1)抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
(2)具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
三、模板方法模式的优缺点
下面让我们继续分析下模板方法的优缺点。

1.优点:实现了代码复用,能够灵活应对子步骤的变化,符合开放-封闭原则。
2.缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。

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

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

相关文章

  • C# 字符串多行显示/文本换行以textbox为例讲解

    C# 字符串多行显示/文本换行以textbox为例讲解

    C# 字符串多行显示、文本换行以textbox为例讲为大家详细介绍并附演示效果图及演示代码,感兴趣的朋友可以了解下,或许对你学习字符串换行有所帮助
    2013-02-02
  • c#获取季度时间实例代码(季度的第一天)

    c#获取季度时间实例代码(季度的第一天)

    这篇文章主要介绍了c#获取季度时间:季度的第一天、季度的最后一天等功能,大家参考使用吧
    2013-12-12
  • c# mutex互斥量的深入解析

    c# mutex互斥量的深入解析

    本篇文章主要是对c#中的mutex互斥量进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • c#字符串使用正则表达式示例

    c#字符串使用正则表达式示例

    这篇文章主要介绍了c#字符串使用正则表达式示例,需要的朋友可以参考下
    2014-02-02
  • C#实例化和静态类对象调用对比

    C#实例化和静态类对象调用对比

    这篇文章主要介绍了C#实例化和静态类对象调用对比,什么时候用实例化对象,什么时候用静态类对象,内存和生命周期又是如何,框架本身的回收机制是什么,下文详细解说需要的小伙伴可以参考一下
    2022-04-04
  • C# PropertyInfo类案例详解

    C# PropertyInfo类案例详解

    这篇文章主要介绍了C# PropertyInfo类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#实现骑士飞行棋

    C#实现骑士飞行棋

    这篇文章主要为大家详细介绍了C#实现骑士飞行棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C#开启线程的四种方式示例详解

    C#开启线程的四种方式示例详解

    今天小编就为大家分享一篇关于C#开启线程的四种方式示例详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C# Winform窗口之间传值的多种方法浅析

    C# Winform窗口之间传值的多种方法浅析

    这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值、通过属性传递、通过事件携带参数传递等方法,需要的朋友可以参考下
    2015-04-04
  • C# Winform中实现主窗口打开登录窗口关闭的方法

    C# Winform中实现主窗口打开登录窗口关闭的方法

    这篇文章主要介绍了C# Winform中实现主窗口打开登录窗口关闭的方法,这在需要用户名密码的软件项目中是必用的一个技巧,要的朋友可以参考下
    2014-08-08

最新评论