六、模版方法模式中的方法
模版方法中的方法可以分為兩大類:模版方法(Template Method)和基本方法(Primitive Method)。
模版方法
一個模版方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總算法或一個總行為的方法。這個模版方法一般會在抽象類中定義,並由子類不加以修改地完全繼承下來。
基本方法
基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。
抽象方法:一個抽象方法由抽象類聲明,由具體子類實現。在C#語言裡一個抽象方法以abstract關鍵字標示出來。
具體方法:一個具體方法由抽象類聲明並實現,而子類並不實現或置換。在C#語言裡面,一個具體方法沒有abstract關鍵字。
鉤子方法:一個鉤子方法由抽象類聲明並實現,而子類會加以擴展。通常抽象類給出的實現是一個空實現,作為方法的默認實現。(Visual FoxPro中項目向導建立的項目會使用一個AppHook類實現監視項目成員變化,調整系統結構的工作。)鉤子方法的名字通常以do開始。
七、重構的原則
在對一個繼承的等級結構做重構時,一個應當遵從的原則便是將行為盡量移動到結構的高端,而將狀態盡量移動到結構的低端。
1995年,Auer曾在文獻【AUER95】中指出:
應當根據行為而不是狀態定義一個類。也就是說,一個類的實現首先建立在行為的基礎之上,而不是建立在狀態的基礎之上。
在實現行為時,是用抽象狀態而不是用具體狀態。如果一個行為涉及到對象的狀態時,使用間接的引用而不是直接的引用。換言之,應當使用取值方法而不是直接引用屬性。
給操作劃分層次。一個類的行為應當放到一個小組核心方法(Kernel Methods)裡面,這些方法可以很方便地在子類中加以置換。
將狀態屬性的確認推遲到子類中。不要在抽象類中過早地聲明屬性變量,應將它們盡量地推遲到子類中去聲明。在抽象超類中,如果需要狀態屬性的話,可以調用抽象的取值方法,而將抽象的取值方法的實現放到具體子類中。
如果能夠遵從這樣的原則,那麼就可以在等級結構中將接口與實現分隔開來,將抽象與具體分割開來,從而保證代碼可以最大限度地被復用。這個過程實際上是將設計師引導到模版方法模式上去。