【C#设计模式-模板模式】
2016-05-04 12:33
204 查看
一.定义:在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
二.实现:引用生活中上班的例子,员工上班遵循前往上班目的地,上班打卡,然后执行自己的工作,最后下班打卡的这样一个流程。
模板方法模式中涉及了两个角色:
抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
优点:实现了代码复用,能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
在.NET中模板方法的应用也很多,我们在开发自定义的Web控件或WinForm控件时,我们只需要重写某个控件的部分方法。
二.实现:引用生活中上班的例子,员工上班遵循前往上班目的地,上班打卡,然后执行自己的工作,最后下班打卡的这样一个流程。
/// <summary> /// 抽象上班模板 /// </summary> public abstract class working { // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 public void Init(string name) { this.gotocompany(name); this.clockin(name); this.workings(name); this.offduty(name); } /// <summary> /// 去公司 /// </summary> public abstract void gotocompany(string name); /// <summary> /// 打卡 /// </summary> private void clockin(string name) { Console.WriteLine("员工:" + name + "上班打卡"); } /// <summary> /// 开展自己的工作 /// </summary> /// <param name="name"></param> public abstract void workings(string name); /// <summary> /// 下班打卡 /// </summary> /// <param name="name"></param> private void offduty(string name) { Console.WriteLine("员工:" + name + "下班班打卡"); } }
/// <summary> /// 员工A /// </summary> public class employeeA:working { public override void gotocompany(string name) { Console.WriteLine(name+"员工做地图前往公司"); } public override void workings(string name) { Console.WriteLine(name+"员工开展程序编码工作"); } }
/// <summary> /// C#设计模式-模板方法模式 /// </summary> class Program { static void Main(string[] args) { working w = new employeeA(); w.Init("A"); } }
模板方法模式中涉及了两个角色:
抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
优点:实现了代码复用,能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。
在.NET中模板方法的应用也很多,我们在开发自定义的Web控件或WinForm控件时,我们只需要重写某个控件的部分方法。
相关文章推荐
- 第三课输入和显示——C#计算器编程教学
- 第二课用循环简化编程——C#计算器编程教学
- C# 判断字符为空的6种方法的效率实测对比
- 【C#设计模式-代理模式】
- C#获取串口列表实现实时监控串口
- 利用最小二乘法拟合任意次函数曲线(C#)
- C#操作共享文件夹
- C# 用DataSet读取数据
- C# 对文本文件的几种读写方法总结
- C# ListView 编写 ListView 实体类
- C#按字节长度截取字符串
- C# 图片文件文本string格式 传输问题
- 深入.NET平台和C#编程 错题录
- C#(四)
- C# 获取磁盘空间信息
- C#调用DLL各种传参
- [C#.NET][Entity Framework] Code First - Reverse engineering from an existing database at EF6.1.0
- 第一课程序框架的构建——C#计算器编程教学
- VS2015 C#6.0 中的那些新特性
- MAC,IP,路由传输封装过程