详解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控件时,我们只需要重写某个控件的部分方法。

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

相关文章

  • WinForm实现跨进程通信的方法

    WinForm实现跨进程通信的方法

    这篇文章主要介绍了WinForm实现跨进程通信的方法,通过一个WinMessageHelper类实现这一功能,需要的朋友可以参考下
    2014-08-08
  • C#异常处理详解

    C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下
    2013-10-10
  • C#调用Python模块的方法

    C#调用Python模块的方法

    这篇文章主要为大家详细介绍了C#调用Python模块的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • C# 在PDF中添加墨迹注释Ink Annotation的步骤详解

    C# 在PDF中添加墨迹注释Ink Annotation的步骤详解

    PDF中的墨迹注释表现为徒手涂鸦式的形状,该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线,下面通过C#程序代码介绍下在pdf中添加注释的步骤,感兴趣的朋友一起看看吧
    2022-02-02
  • C# Socket实现简单控制台案例

    C# Socket实现简单控制台案例

    这篇文章主要为大家分享了C# Socket简单的控制台案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • unity实现按住鼠标选取区域截图

    unity实现按住鼠标选取区域截图

    这篇文章主要为大家详细介绍了unity实现按住鼠标选取区域截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#创建临时文件的方法

    C#创建临时文件的方法

    这篇文章主要介绍了C#创建临时文件的方法,涉及C#中Path.GetTempFileName方法获取与操作临时文件的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#实现BBcode转为Markdown的方法

    C#实现BBcode转为Markdown的方法

    这篇文章主要给大家介绍了关于C#实现BBcode转Markdown的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • .net中常用的正则表达式

    .net中常用的正则表达式

    这篇文章介绍了.net中常用的正则表达式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# SelectedIndexChanged事件详解

    C# SelectedIndexChanged事件详解

    这篇文章主要介绍了C# SelectedIndexChanged事件详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论