Definición del modo TemplateMethod (TemplateMethod): define el esqueleto de un algoritmo en funcionamiento, retrasa algunos pasos a las subclases. El método de plantilla permite que las subclases redefinan ciertos pasos específicos de un algoritmo sin cambiar la estructura del algoritmo.
ventaja:
- Algunos detalles de la implementación de la subclase del algoritmo son útiles para la expansión del algoritmo.
- La operación realizada llamando a una subclase por una clase padre y agregando nuevos comportamientos por extensión de subclase, se ajusta al "principio abierto-cerrado".
- La reutilización del código está bien realizada, el comportamiento sin cambios se coloca en la superclase y se elimina la duplicación de subclases.
Desventajas: - Cada implementación diferente necesita definir una subclase, lo que conducirá a un aumento en el número de clases y un diseño más abstracto.
Escena aplicable:
- En algunos tipos de algoritmos, se utiliza el mismo método, lo que provoca la duplicación de código.
- Para controlar la extensión de las subclases, las subclases deben cumplir con las reglas del algoritmo.
Antecedentes del ejemplo: El tutor quiere dar a dos estudiantes el mismo conjunto de preguntas. Los dos estudiantes son demasiado estúpidos para distinguir el orden de las preguntas. No hay forma de que el maestro solicite otra prueba y pida a los estudiantes que escriban el pregunta (número de pregunta) primero.
Categoría de examen:
class TestPaper //给出了逻辑骨架,具体实现留到了子类中
{
public void TestQuestion1()
{
Console.WriteLine("考题1的答案是[ ]a. b. c. d.");
Console.WriteLine("答案:"+Answer1());
}
public void TestQuestion2()
{
Console.WriteLine("考题2的答案是[ ]a. b. c. d.");
Console.WriteLine("答案:" + Answer2());
}
public void TestQuestion3()
{
Console.WriteLine("考题3的答案是[ ]a. b. c. d.");
Console.WriteLine("答案:" + Answer3());
}
//逻辑的组成是一些抽象的操作,虚方法为了让子类重写自己的答案
protected virtual string Answer1()
{
return "";
}
protected virtual string Answer2()
{
return "";
}
protected virtual string Answer3()
{
return "";
}
}
Prueba del alumno A:
class TestPaperA:TestPaper //同学甲、乙可以有不同的实现方法
{
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "a";
}
}
Prueba del alumno B:
class TestPaperB : TestPaper
{
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "b";
}
}
Cliente:
static void Main(string[] args)
{
Console.WriteLine("学生甲的试卷");
//这里使用多态,将子类对象转成父类对象,方便使用父类的方法,实现了代码复用
TestPaper studentA = new TestPaperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
Console.WriteLine("学生乙的试卷");
TestPaper studentB = new TestPaperB();
studentB.TestQuestion1();
studentB.TestQuestion2();
studentB.TestQuestion3();
Console.ReadLine();
}