前言
感觉模板方法模式和原型有些一样的地方,以后会再次进行分析和总结。这篇博客主要来介绍模板方法模式的使用和代码展示。
模板方法模式
what
模板方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用平台,降低了耦合度。
情景
考试要做的选择题。大家的试卷内容都是一样的,只不过大家给出的答案在abcd中可能不同,这时就可以选择用模板方法模式来进行,编写一个试卷类,然后有具体试卷来继承试卷类就可以了。具体试卷的答案各不相同,但是试卷类的内容是一样的
应用
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
代码展示
试卷类:
class TestQuestion //试卷类
{
public void TestQuestion1()
{
Console.WriteLine("郭倩是?性格的人?[] a.可爱 b.聪明 c. 善良 d.以上全对+无敌");
Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
}
protected virtual string Answer1() //此方法的目的就是给继承的子类重写,因为这里每个人的答案都是不同的。
{
return "";
}
//同上!!!
public void TestQuestion2()
{
Console.WriteLine("刘木同是?性格的人?[] a.帅气 b.睿智 c. 负责人 d.以上全不对+无敌");
Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
}
public void TestQuestion3()
{
Console.WriteLine("哈哈是?性格的人? []a.可爱 b.聪明 c. 善良 d.以上全不 对+无敌");
Console.WriteLine("答案:" + Answer1());//将答案改成一个虚方法
}
protected virtual string Answer2()
{
return "";
}
protected virtual string Answer3()
{
return "";
}
}
A同学试卷:
class TestPaperA:TestQuestion
{
//重写虚方法后,把答案填上,其他的不用写了。因为父类建立了所有的重复的模板
protected override string Answer1()
{
return "d";
}
protected override string Answer2()
{
return "d";
}
protected override string Answer3()
{
return "d";
}
}
B同学试卷:—同A
class TestPaperB:TestQuestion
{
protected override string Answer1()
{
return "d";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "a";
}
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("学生A抄的试卷");
TestQuestion studentA = new TestPaperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
Console.WriteLine("学生B抄的试卷");
TestQuestion studentB = new TestPaperB();
studentB.TestQuestion1();
studentB.TestQuestion2();
studentB.TestQuestion3();
Console.Read();
}
}
效果展示:
后记
看这个模式真是看的脑袋晕晕的,不过实在迷糊了,建议跟着错的敲一遍,一点一点改,总会明白的!