我們知道中國是一個“制造大國”而非一個“創造大國”,為什麼這麼說呢?因為我們中國人的智慧是無與倫比的,我們對於“模仿”來說有著與生俱來的天賦,但是從“創新”的角度來看還是舉步維艱。這次來談談國人的智慧-“模仿”。
說起“模仿”不得不提“模板”,因為有一個“模板”才能模仿出自己需要的東西。話說,當年的國產山寨機可是風靡一時,那麼就以制造手機來理解一下“模板方法模式”。
代碼結構圖:
在這裡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.當不變和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重復出現,我們通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重復的不變行為的糾纏。