??模板方法模式(TemplateMethod)定義: 定義一個操作中的演算法的骨架,將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重新定義該演算法的某些特定步驟,
??優點:
- 子類實作演算法的某些細節,有助于演算法的擴展,
- 通過一個父類呼叫子類實作的操作,通過子類擴展增加新的行為,符合“開放-封閉原則”,
- 很好的實作了代碼復用,把不變的行為放置到超類中,去除子類的重復,
缺點: - 每個不同的實作都需要定義一個子類,這會導致類的個數的增加,設計更加抽象,
??適用場景:
- 在某些類的演算法中,用了相同的方法,造成代碼的重復,
- 控制子類擴展,子類必須遵守演算法規則,
??例子背景: 家教老師要給兩個學生出同一套題,兩個學生太笨題目都分不清順序,沒辦法老師要求再考一次,并且讓學生把題目(題號)先寫下來,
試卷類:
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 "";
}
}
學生甲的試卷:
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 "b";
}
protected override string Answer2()
{
return "c";
}
protected override string Answer3()
{
return "b";
}
}
客戶端:
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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230638.html
標籤:其他
上一篇:A - 卡牌游戲 III
