模板方法模式
TemplateMethod:定义一个操作中的算法的骨架,而将这些操作延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
结构图
ps:
AbstractClass 实现了一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。
concreteClass 实现primitiveOperation已完成算法中与特定子类相关的步骤。
大话中关于考试抄错题的为例
类图如下
代码实现
class TestPaper
{
//
public void TestQuestion1()
{
Console.WriteLine("10*10=[] a.100 b.30 c. 50");
Console.WriteLine("答案:" + Answer1());
}
protected virtual string Answer1()
{
return "";
}
public void TestQuestion2()
{
Console.WriteLine("20+50=[] a.20 b.30 c.70");
Console.WriteLine("答案:" + Answer2());
}
protected virtual string Answer2()
{
return "";
}
public void TestQuestion3()
{
Console.WriteLine("100/20=[] a.5 b.50 c.20");
Console.WriteLine("答案:" + Answer3());
}
protected virtual string Answer3()
{
return "";
}
}
//学生子类代码
class TestPapperA : TestPaper
{
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "b";
}
}
//学生乙抄的试卷
class TestPapperB : TestPaper
{
protected override string Answer1()
{
return "c";
}
protected override string Answer2()
{
return "a";
}
protected override string Answer3()
{
return "b";
}
}
客户端代码
static void Main(string[] args)
{
Console.WriteLine("学生甲抄写的试卷:");
TestPaper studentA = new TestPapperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
Console.WriteLine("学生乙抄写的试卷:");
TestPaper studentB=new TestPapperB ();
studentB .TestQuestion1 ();
studentB .TestQuestion2();
studentB .TestQuestion3();
Console.Read ();
}
模板方法模式适用的场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、控制子类扩展。模板方法只是特定点调用操作,这样就只允许在这些点进行扩展。
可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。