我們知道中國是一個“制造大國”而非一個“創造大國”,為什麼這麼說呢?因為我們中國人的智慧是無與倫比的,我們對於“模仿”來說有著與生俱來的天賦,但是從“創新”的角度來看還是舉步維艱。這次來談談國人的智慧-“模仿”。 說起“模仿”不得不提“模板”,因為有一個“模板”才能模仿出自己需要的東西。話說,當年的國產山寨機可是風靡一時,那麼就以制造手機來理解一下“模板方法模式”。 代碼結構圖: 在這裡Telephone是抽象類,其實也就是一個抽象模板,定義並實現了一個模板方法call()。這個模板方法是一個具體的方法,給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。 模板代碼: [csharp] <SPAN style="FONT-SIZE: 18px">//手機 public abstract class Telephone { //能夠撥打電話 public abstract void dial() ; //實現通話功能 public abstract void communicate(); //掛斷電話 public abstract void hangup(); //匯總一下,才叫做通話-骨架 public void call() { //先撥號 this.dial(); //接聽後可以通話 this.communicate(); //通話完畢,掛斷 this.hangup(); Console.WriteLine(""); } }</SPAN> //手機 public abstract class Telephone { //能夠撥打電話 public abstract void dial() ; //實現通話功能 public abstract void communicate(); //掛斷電話 public abstract void hangup(); //匯總一下,才叫做通話-骨架 public void call() { //先撥號 this.dial(); //接聽後可以通話 this.communicate(); //通話完畢,掛斷 this.hangup(); Console.WriteLine(""); } }Nokia代碼: [csharp] <SPAN style="FONT-SIZE: 18px">//山寨計劃-Nokia class Nokia : Telephone { public override void dial() { //Nokia獨特的聲響 Console.WriteLine("鈴鈴鈴,Nokia用戶撥打中..."); } public override void communicate() { Console.WriteLine("告訴你個好消息,我用上Nokia了"); } public override void hangup() { Console.WriteLine("滴..滴."); } }</SPAN> //山寨計劃-Nokia class Nokia : Telephone { public override void dial() { //Nokia獨特的聲響 Console.WriteLine("鈴鈴鈴,Nokia用戶撥打中..."); } public override void communicate() { Console.WriteLine("告訴你個好消息,我用上Nokia了"); } public override void hangup() { Console.WriteLine("滴..滴."); } }Iphone代碼: [csharp] <SPAN style="FONT-SIZE: 18px">//山寨計劃-Iphone class Iphone : Telephone { public override void dial() { //Nokia獨特的聲響 Console.WriteLine("啦啦啦,Iphone撥打中..."); } public override void communicate() { Console.WriteLine("小李呀,我買蘋果了,羨慕吧..."); } public override void hangup() { Console.WriteLine("咚..咚.."); } }</SPAN> //山寨計劃-Iphone class Iphone : Telephone { public override void dial() { //Nokia獨特的聲響 Console.WriteLine("啦啦啦,Iphone撥打中..."); } public override void communicate() { Console.WriteLine("小李呀,我買蘋果了,羨慕吧..."); } public override void hangup() { Console.WriteLine("咚..咚.."); } }客戶端代碼: [csharp] <SPAN style="FONT-SIZE: 18px"> //客戶端client static void Main(string[] args) { //使用nokia Telephone nokia1 = new Nokia(); nokia1.call(); //使用Iphone Telephone iphone= new Iphone(); iphone.call(); Console.Read(); }</SPAN> //客戶端client static void Main(string[] args) { //使用nokia Telephone nokia1 = new Nokia(); nokia1.call(); //使用Iphone Telephone iphone= new Iphone(); iphone.call(); Console.Read(); }客戶端中將變量聲明改為父類,利用了多態性,實現了代碼的復用。 啟動後: 這樣一款山寨的nokia和iphone就誕生了... 通過這個簡單的小例子是否對模板方法模式有了初步的了解。那麼模板模式有什麼特點呢: 1.當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,我們通常考慮用模板方法模式來處理; 2.模板方法模式是通過把不變行為搬移到超類,去除子類中的重復代碼來體現它的優勢; 3.模板方法提供了一個很好的代碼復用平台; 4.當不變和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重復出現,我們通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重復的不變行為的糾纏。