定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
1.UML类图:
2.代码实现:
abstract class AbstractClass { //父类中定义一些抽象行为 放到子类中去实现 public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); //模板方法,给出逻辑的骨架,而逻辑的组成是一些相应的抽象对象,他们都推迟到子类实现 public void TemplatedMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine( ""); } }
//子类A的具体实现 class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类A的方法一实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类A的方法二实现"); } } //子类B的具体实现 class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类B的方法一实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类B的方法二实现"); } }
客户端:
class Program
{
static void Main(string[] args)
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplatedMethod();
c = new ConcreteClassB();
c.TemplatedMethod();
Console.Read();
}
}
输出:具体类A的方法一实现
具体类A的方法二实现
具体类B的方法一实现
具体类B的方法二实现
3.实例###
试卷的模板实现:
1.UML类图
2.代码实现:
//试卷模板
class TestPaper
{
public void TestQuestion1()
{
Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁 b. 马口铁 c.高速合金钢");
Console.WriteLine("答案:" +Answer1());
}
protected virtual string Answer1()
{
return "";
}
public void TestQuestion2()
{
Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁 b. 马口铁 c.高速合金钢");
Console.WriteLine("答案:" + Answer2());
}
protected virtual string Answer2()
{
return "";
}
public void TestQuestion3()
{
Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁 b. 马口铁 c.高速合金钢");
Console.WriteLine("答案:" + Answer3());
}
protected virtual string Answer3()
{
return "";
}
//学生A的试卷
class TestPaperA: TestPaper
{
protected override string Answer1()
{
return "a";
}
protected override string Answer2()
{
return "b";
}
protected override string Answer3()
{
return "c";
}
}
//学生B的试卷
class TestPaperB:TestPaper
{
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "a";
}
protected override string Answer3()
{
return "c";
}
}
客户端:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("A学生试卷");
TestPaper tpa = new TestPaperA();
tpa.TestQuestion1();
tpa.TestQuestion2();
tpa.TestQuestion3();
Console.WriteLine("B学生试卷");
TestPaper tpb = new TestPaperB();
tpb.TestQuestion1();
tpb.TestQuestion2();
tpb.TestQuestion3();
Console.Read();
}
}
输出:
4.模板模式的使用场景
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上实现可能不同时,我们通常考虑用模板方法模式处理
5.优点
通过把不变行为搬移到超类,去除子类中的重复代码。