一、概念
上一篇文章刚刚讲了【大话设计模式】——
原型模式,原型模式主要是通过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 { //客户端代码 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 "情人节,送礼物,有情人终成眷属"; } } }
追求历程:
四、总结
当我们要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法避免了子类中不变行为和可变行为的混合,帮助子类摆脱重复不变行为的纠缠。
看到模板方法模式,让我心中小感慨了一下。从技术的角度看,它符合开闭原则,提高了编程效率;从生活角度来看,儿子继承老子给的模板,也是父爱的一种表现吧。毕竟我们的起点是建立在家庭基础之上的。但是父类却没有独裁,没有限制我们后来的发展,给了我们展示自我,突破自我的机会(也就是后来具体实现的步骤延迟到了子类),感觉老爸真的很无私,很伟大!
虽然父亲节已过,但愿祝福的不算太晚。祝全天下的爸爸,父亲节快乐,身体健康!当然也包括给予我们父爱的米老师,谢谢您!
【大话设计模式】—— 模板方法模式,布布扣,bubuko.com