模板方法模式,定義一個操做中的算法的骨架,而將一些步驟移動(變更的部分)到子類中,模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。javascript
模板方法的關鍵點在於對重複代碼的提煉(要精準)。模板方法就是提供了一個很好的代碼複用平臺。html
如下給出模板方法模式的UML圖:java
如下給出模板方法模式的代碼結構:git
namespace ConsoleApplication1 { 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實現"); //與ConcreteClassB不一樣的方法實現 } public override void PrimitiveOperation2() { Console.WriteLine("具體類A的方法2實現"); } } class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具體類B的方法1實現"); //與ConcreteClassA不一樣的方法實現 } public override void PrimitiveOperation2() { Console.WriteLine("具體類B的方法2實現"); } } class Program { static void Main(string[] args) { AbstractClass c; c = new ConcreteClassA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); Console.ReadKey(); } } }
如下給出《大話設計模式》裏的兩個簡歷例子,對比來看模板方法模式的好處。算法
如下爲例子1:設計模式
namespace ConsoleApplication1 { //學生甲抄的試卷 class TestPaperA { //試題1 public void TestQuestion1() { Console.WriteLine("楊過獲得,後來給了郭靖,煉成倚天劍、屠龍刀的玄鐵多是[ ] a、球磨鑄鐵 b、馬口鐵 c、高速合金鋼 d、碳素纖維"); Console.WriteLine("答案:b"); } //試題2 public void TestQuestion2() { Console.WriteLine("楊過、程英、陸無雙剷除了情花,形成[ ] a、使這種植物不在害人 b、使一種珍惜物種滅絕 c、破壞了生物圈平衡 d、形成該地區沙漠化"); Console.WriteLine("答案:a"); } //試題3 public void TestQuestion3() { Console.WriteLine("藍鳳凰導致華山師徒、陶谷六仙嘔吐不止,若是你是大夫,會給他們開什麼要[ ] a、阿司匹林 b、牛黃解毒片 c、感康 d、讓他們喝大量的生牛奶 e、以上都不對"); Console.WriteLine("答案:c"); } } //學生乙抄的試卷 class TestPaperB { //試題1 public void TestQuestion1() { Console.WriteLine("楊過獲得,後來給了郭靖,煉成倚天劍、屠龍刀的玄鐵多是[ ] a、球磨鑄鐵 b、馬口鐵 c、高速合金鋼 d、碳素纖維"); Console.WriteLine("答案:d"); } //試題2 public void TestQuestion2() { Console.WriteLine("楊過、程英、陸無雙剷除了情花,形成[ ] a、使這種植物不在害人 b、使一種珍惜物種滅絕 c、破壞了生物圈平衡 d、形成該地區沙漠化"); Console.WriteLine("答案:b"); } //試題3 public void TestQuestion3() { Console.WriteLine("藍鳳凰導致華山師徒、陶谷六仙嘔吐不止,若是你是大夫,會給他們開什麼要[ ] a、阿司匹林 b、牛黃解毒片 c、感康 d、讓他們喝大量的生牛奶 e、以上都不對"); Console.WriteLine("答案:a"); } } class Program { static void Main(string[] args) { Console.WriteLine("學生甲抄的試卷:"); TestPaperA studentA = new TestPaperA(); studentA.TestQuestion1(); studentA.TestQuestion2(); studentA.TestQuestion3(); Console.WriteLine("學生乙抄的試卷:"); TestPaperB studentB = new TestPaperB(); studentB.TestQuestion1(); studentB.TestQuestion2(); studentB.TestQuestion3(); Console.ReadKey(); } } }
留意到以上大量的重複代碼,複製粘貼這樣的代碼幾乎是沒法維護的。我也是這樣寫的,我操。ide
如下來看看模板方法模式的代碼:post
namespace ConsoleApplication1 { //金庸小說考題試卷 class TestPaper { public void TestQuestion1() { Console.WriteLine("楊過獲得,後來給了郭靖,煉成倚天劍、屠龍刀的玄鐵多是[ ] a、球磨鑄鐵 b、馬口鐵 c、高速合金鋼 d、碳素纖維"); Console.WriteLine("答案:" + Answer1()); } public void TestQuestion2() { Console.WriteLine("楊過、程英、陸無雙剷除了情花,形成[ ] a、使這種植物不在害人 b、使一種珍惜物種滅絕 c、破壞了生物圈平衡 d、形成該地區沙漠化"); Console.WriteLine("答案:" + Answer2()); } public void TestQuestion3() { Console.WriteLine("藍鳳凰導致華山師徒、陶谷六仙嘔吐不止,若是你是大夫,會給他們開什麼要[ ] a、阿司匹林 b、牛黃解毒片 c、感康 d、讓他們喝大量的生牛奶 e、以上都不對"); 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 "c"; } protected override string Answer2() { return "a"; } protected override string Answer3() { return "a"; } } class Program { static void Main(string[] args) { Console.WriteLine("學生甲抄的試卷:"); TestPaperA studentA = new TestPaperA(); studentA.TestQuestion1(); studentA.TestQuestion2(); studentA.TestQuestion3(); Console.WriteLine("學生乙抄的試卷:"); TestPaperB studentB = new TestPaperB(); studentB.TestQuestion1(); studentB.TestQuestion2(); studentB.TestQuestion3(); Console.ReadKey(); } } }
能夠看到,提煉的很是厲害,能夠說是徹底沒有複製的代碼。這樣的代碼維護起來仍是很是容易的。仍是那一點,模板方法的關鍵在於提煉。學習