博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#设计模式系列:模板方法模式(Template Method Pattern)
阅读量:6082 次
发布时间:2019-06-20

本文共 3909 字,大约阅读时间需要 13 分钟。

引言

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

模板方法介绍

模板方法模式的定义

      定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模仿方法使得子类可以不改变一个算法的结构既可重定义该算法的某些特定步骤

模仿方法模式的结构图

模式的组成

  AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法,这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体的方法

  ConcreteClass实现了父类所定义的一个或多个抽象放啊,每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以出这些抽象方法(也就是顶级逻辑的组成步骤)不同的实现,从而使得顶级逻辑的实现各不相同

看了模板方法的定义以及结构图,下面我们来看看在代码中如何使用

   题目:要下课了老师在黑板出家庭作业,每个学生都要抄题目。

   第一版无模式

///     /// 学生甲    ///     public class MethodA    {        public void TestQuestion1()        {            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:b");        }        public void TestQuestion2()        {            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:a");        }        public void TestQuestion3()        {            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:c");        }    }    ///     /// 学生已    ///     public class MethodB    {        public void TestQuestion1()        {            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:b");        }        public void TestQuestion2()        {            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:a");        }        public void TestQuestion3()        {            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:c");        }    }  ///     /// 客户端    ///     class Program    {        static void Main(string[] args)        {            Console.WriteLine("学生甲的试题:");            MethodA a = new MethodA();            a.TestQuestion1();            a.TestQuestion2();            a.TestQuestion3();            Console.WriteLine("学生已的试题:");            MethodB  B= new MethodB();            B.TestQuestion1();            B.TestQuestion2();            B.TestQuestion3();        }    }
View Code

可以看出内容相识度很高,除了答案不同,没什么不一样了,这样的代码容易出错,难以维护,学习了模板方法以后进行改版

第二版

///     /// 抽象类    ///     public abstract class TestQuestion    {        public void TestQuestion1()        {            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:"+ Anster1());        }        public void TestQuestion2()        {            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:"+Anster2());        }        public void TestQuestion3()        {            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");            Console.WriteLine("答案:"+ Anster3());        }        public virtual string Anster1()        {            return "";        }        public virtual string Anster2()        {            return "";        }        public virtual string Anster3()        {            return "";        }    }    ///     /// 学生甲    ///     public class MethodA:TestQuestion    {        public override string Anster1()        {            return "a";        }        public override string Anster2()        {            return "b";        }        public override string Anster3()        {            return "c";        }    }    ///     /// 客户端    ///     class Program    {        static void Main(string[] args)        {            Console.WriteLine("学生甲的试题:");            TestQuestion a = new MethodA();            a.TestQuestion1();            a.TestQuestion2();            a.TestQuestion3();        }    }
View Code

y引入模板方法模式后,代码的可读性增加了,将不变的代码抽象为父类,子类子需要填写答案就行了

模板方法模式的优缺点

优点:

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

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

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

总结

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

转载于:https://www.cnblogs.com/studydp/p/9568528.html

你可能感兴趣的文章
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>