一垦细、模板方法模式
- AbstractClass 抽象類(lèi)。
abstract class AbstractClass
{
//一些抽象行為音半,放到子類(lèi)中去實(shí)現(xiàn)
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
//模板方法,給出了邏輯的股價(jià),而邏輯的組成是一些相應(yīng)的抽象操作夯巷,它們都推遲到子類(lèi)中去實(shí)現(xiàn)
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
- ConcreteClass 實(shí)現(xiàn)父類(lèi)所定義的一個(gè)或多個(gè)抽象方法赛惩。每一個(gè) AbstractClass 都可以有多個(gè) ConcreteClass 與之對(duì)應(yīng),而每一個(gè) ConcreteClass 都可以給出這些抽象方法的不同實(shí)現(xiàn)趁餐,從而使得頂級(jí)邏輯的實(shí)現(xiàn)各不相同喷兼。
class ConcreteClassA: AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("A 方法1實(shí)現(xiàn)");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("A 方法2實(shí)現(xiàn)");
}
}
class ConcreteClassB: AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("B 方法1實(shí)現(xiàn)");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("B 方法2實(shí)現(xiàn)");
}
}
二、模板方法模式的特點(diǎn)
是通過(guò)把不變的行為放到抽象類(lèi)中后雷,取出子類(lèi)中的重復(fù)代碼來(lái)體現(xiàn)它的優(yōu)勢(shì)季惯。
三、舉例
using System;
namespace Factory1
{
class TestPaper{
public void TestQuestion1(){
Console.WriteLine("maybe TestQuestion1 [ ]a.A b.B c.C d.D");
Console.WriteLine("answer: " + Answer1());
}
public void TestQuestion2()
{
Console.WriteLine("maybe TestQuestion2 [ ] a.A b.B c.C d.D");
Console.WriteLine("answer: " + Answer2());
}
public void TestQuestion3()
{
Console.WriteLine("maybe TestQuestion3 [ ] a.A b.B c.C d.D");
Console.WriteLine("answer: " + Answer3());
}
protected virtual string Answer1()
{
return "";
}
protected virtual string Answer2()
{
return "";
}
protected virtual string Answer3()
{
return "";
}
}
class TestPaperA: TestPaper{
protected override string Answer1()
{
return "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "a";
}
}
class TestPaperB: TestPaper{
protected override string Answer1()
{
return "c";
}
protected override string Answer2()
{
return "b";
}
protected override string Answer3()
{
return "a";
}
}
//調(diào)用
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("studentA");
TestPaper studentA = new TestPaperA ();
studentA.TestQuestion1 ();
studentA.TestQuestion2 ();
studentA.TestQuestion3 ();
TestPaper studentB = new TestPaperB ();
studentB.TestQuestion1 ();
studentB.TestQuestion2 ();
studentB.TestQuestion3 ();
Console.Read ();
}
}
}
+結(jié)果:
studentA
maybe TestQuestion1 [ ]a.A b.B c.C d.D
answer: b
maybe TestQuestion2 [ ] a.A b.B c.C d.D
answer: c
maybe TestQuestion3 [ ] a.A b.B c.C d.D
answer: a
maybe TestQuestion1 [ ]a.A b.B c.C d.D
answer: c
maybe TestQuestion2 [ ] a.A b.B c.C d.D
answer: b
maybe TestQuestion3 [ ] a.A b.B c.C d.D
answer: a