一、概念
上一篇文章刚刚讲了【大话设计模式】—— 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程。模板方法模式也特别会“偷工减料”,把不变的行为搬移到超类,去除子类中的反复代码,将代码的复用优势展现的淋漓尽致。它为我们提供了特定的结构和样式,我们仅仅需关心填充数据内容就好,省心啊~
以下让我们来看一下它的准确定义:
模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构就可以重定义该算法的某些特定的步骤。
二、UML图
抽象类(AbstractClass):
1)定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。2)定义并实现了一个模板方法,这个模板方法通常是一个详细的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,推迟到子类实现。
详细类(ConcreteClass):
1)实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑在组成步骤。
2)每个抽象模板角色都能够有随意多个详细模板角色与之相应,而每个详细模板角色都能够给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不同样。
三、实例解析
近期《分手大师》和《爸爸回来了》炒的非常厉害,当然这也引发了部分观众对当中男女主人公的好奇心,当然也包含我。。。不少的訪谈节目大大剖析了国民男神—小鹏哥,无敌“贱”—邓超的感情经历。经本人常年研究发现,非常多男名人追老婆的步骤差点儿相同:1.一见钟情(我猜邓超说不定是“贱”。。。)2.两情相悦 3.喜结连理(走进了“坟墓里”,然后就没有然后了~),可是他们追求嫂夫人的方式却各不同样。这正迎合了模板方法模式,定义了一个追求的骨架,详细的步骤因人而异。
以下请赞赏代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { class Program { //client代码 static void Main(string[] args) { Console.WriteLine("李小鹏哥哥的求婚历程:"); ChasingGirl Lxp = new Lxp(); Lxp.Part1(); Lxp.Part2(); Lxp.Part3(); Console.WriteLine("邓超哥哥的求婚历程:"); ChasingGirl Dc = new Dc(); Dc.Part1(); Dc.Part2(); Dc.Part3(); Console.Read(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { //怎样追女生呢? class ChasingGirl { //追女第一步 public void Part1() { Console.WriteLine("一见钟情"); Console.WriteLine("详细措施:" + Measures1()); } protected virtual string Measures1() { return ""; } //追女第二步 public void Part2() { Console.WriteLine("两情相悦"); Console.WriteLine("详细措施:" + Measures2()); } protected virtual string Measures2() { return ""; } //追女第三步 public void Part3() { Console.WriteLine("喜结连理"); Console.WriteLine("详细措施:" + Measures3()); } protected virtual string Measures3() { return ""; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { //李小鹏追老婆的详细方式 class Lxp : ChasingGirl { protected override string Measures1() { return "2003世锦赛3块金牌,不只为了国家,也为了爱情"; } protected override string Measures2() { return "为了爱情苦学英语,请英语老师补课,注冊了MSN,每天都与安琦相约在网上,用英语聊天。"; } protected override string Measures3() { return "2010年6月3日,李小鹏与李安琪结束七年爱情长跑,迈入婚姻的殿堂"; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { //邓超追老婆的详细方式 class Dc : ChasingGirl { protected override string Measures1() { return "共同出演电视剧《幸福像花儿一样》,有缘千里来相会"; } protected override string Measures2() { return "戏里“对手”戏外相知 ,有开心,也有小别扭"; } protected override string Measures3() { return "情人节,送礼物,有情人终成眷属"; } } }
追求历程:
四、总结
当我们要完毕某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更具体的层次上的实现可能不同一时候,我们通常考虑用模板方法模式来处理。
模板方法避免了子类中不变行为和可变行为的混合,帮助子类摆脱反复不变行为的纠缠。
看到模板方法模式,让我心中小感慨了一下。从技术的角度看,它符合开闭原则,提高了编程效率;从生活角度来看,儿子继承老子给的模板,也是父爱的一种表现吧。毕竟我们的起点是建立在家庭基础之上的。可是父类却没有独裁,没有限制我们后来的发展,给了我们展示自我,突破自我的机会(也就是后来详细实现的步骤延迟到了子类),感觉老爸真的非常无私,非常伟大!
尽管父亲节已过,但愿祝福的不算太晚。祝全天下的爸爸,父亲节快乐,身体健康!当然也包含给予我们父爱的米老师,谢谢您!