定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模版方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
使用时机: 将公共要用到的方法提取到父类,将需要改变的值或方法写成可重写的,通过继承将共同的方法传递到子类,然后再通过重写改变具体的需要改变的值得到最后想要的结果。其实和继承多态一个逻辑
class Program
{
static void Main(string[] args)
{
//AbstractClass c; //原始的模版方法模式
//c = new ConcreteClassA(); //执行步骤:1.申明但不实例化AbstractClass的对象c;
//c.TemplateMethod(); // 2.实例化具体的继承于AbstractClass的类ConcreteClassA/ConcreteClassB并传给你c,然后c执行TemplateMethod方法,TemplateMethod的方法有AbstractClass
// 中两个方法的具体实现。输出结果。
//c = new ConcreteClassB();
//c.TemplateMethod();
//Console.ReadKey();
TestPaper testPaperA = new TestPaperA(); //带例子的演示 //执行步骤:1.声明TestPaper对象testPaperA/testPaperB,并将继承于其的子类TestPaperA/TestPaperB实例化给它。
testPaperA.TestQuestion1 (); // 2.testPaperA/testPaper执行TestQuestion1、TestQuestion2、TestQuestion3方法,由于父类中TestQuestion1、TestQuestion2、TestQuestion3方法中的answer
testPaperA.TestQuestion2(); // 在子类中有重写,故最后输出的结果是子类重写父类中的Answer方法,然后结合TestQuestion输出的。
testPaperA.TestQuestion3();
TestPaper testPaperB = new TestPaperB();
testPaperB.TestQuestion1();
testPaperB.TestQuestion2();
testPaperB.TestQuestion3();
Console.ReadKey();
}
}
abstract class AbstractClass
{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类A方法1实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类A方法2实现");
}
}
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类B方法1实现");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类B方法2实现");
}
}
class TestPaper
{
public void TestQuestion1()
{
Console.WriteLine("毛毛都的无聊生活测试问题:1");
Console.WriteLine("答案是"+ Answer1());
}
public void TestQuestion2()
{
Console.WriteLine("毛毛都的无聊生活测试问题:2");
Console.WriteLine("答案是" + Answer2());
}
public void TestQuestion3()
{
Console.WriteLine("毛毛都的无聊生活测试问题:3");
Console.WriteLine("答案是" + Answer3());
}
public virtual string Answer1()
{
return "";
}
public virtual string Answer2()
{
return "";
}
public virtual string Answer3()
{
return "";
}
}
class TestPaperA : TestPaper
{
public override string Answer1()
{
return "A";
}
public override string Answer2()
{
return "B";
}
public override string Answer3()
{
return "C";
}
}
class TestPaperB : TestPaper
{
public override string Answer1()
{
return "D";
}
public override string Answer2()
{
return "A";
}
public override string Answer3()
{
return "B";
}
}
转载请注明出处!!!
欢迎加入951815219群聊,共享知识,讨论交流~