1.定义
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重新定义该算法的某些特定步骤。
2.理解
提到模板,我们大家都很熟悉,说白了它就是一个骨架或者样式,只需要我们去填充内容就可以了。把这种思想散发到编程中,就是我们的模板方法模式。
3.举例
老师给学生出考试题,老师先要把考题写在黑板上然后学生抄下来才能答题,相信大家都这样考试过。很显然这种方式效率很低,本来考试一个小时内就可以完成,现在抄题就要花费半个小时,班里每个学生都花费半个小时抄题会造成多少时间的浪费啊!凡是有点良心的老师就会把试题提前整理成模板,每人打印一份,学生只需要在空白处写答案就可以了,这样既能提高效率又能保证大家的题目不会抄错,何乐而不为呢?
//试卷模板
class TestPaper
{
public void TestQuestion1()//试题1
{
Console.WriteLine("杨过得到,后来给了郭靖,练成倚天剑、屠龙刀的玄铁可能是[] a.球墨铸铁 b.马口铁 c.高速合金铁 d.碳素纤维");
Console.WriteLine("答案:" + Answer1());//虚方法
}
public void TestQuestion2()//试题2
{
Console.WriteLine("杨过、程英、陆无双铲除了情花,造成[] a.是这种植物不在害人 b.是一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成了该地区沙漠化");
Console.WriteLine("答案:" + Answer2());
}
public void TestQuestion3()//试题3
{
Console.WriteLine("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,去给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对");
Console.WriteLine("答案:" + Answer3());
}
protected virtual string Answer1()//试题1答题卡
{
return "";
}
protected virtual string Answer2()//试题2答题卡
{
return "";
}
protected virtual string Answer3()//试题3答题卡
{
return "";
}
}
//学生甲的试卷
class TestPaperA:TestPaper
{
protected override string Answer1()
{
return "b";//考生答案
}
protected override string Answer2()
{
return "c";//考生答案
}
protected override string Answer3()
{
return "a";//考生答案
}
}
//学生乙的试卷
class TestPaperB : TestPaper
{
protected override string Answer1()
{
return "c";//考生答案
}
protected override string Answer2()
{
return "a";//考生答案
}
protected override string Answer3()
{
return "a";//考生答案
}
}
static void Main(string[] args)
{
Console.WriteLine("学生A抄的试卷:");
TestPaper studentA = new TestPaperA();
studentA.TestQuestion1();//考生A的试题1答案
studentA.TestQuestion2();//考生A的试题2答案
studentA.TestQuestion3();//考生A的试题3答案
Console.WriteLine("学生B抄的试卷:");
TestPaper studentB = new TestPaperB();
studentB.TestQuestion1();//考生B的试题1答案
studentB.TestQuestion2();//考生B的试题2答案
studentB.TestQuestion3();//考生B的试题3答案
Console.Read();
}
4.特点
模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠,为我们提供了很好的代码复用平台。