|
在面向?qū)ο蟪绦蛟O(shè)計過程中,程序員常常會遇到這種情況:設(shè)計一個系統(tǒng)時知道了算法所需的關(guān)鍵步驟,而且確定了這些步驟的執(zhí)行順序,但某些步驟的具體實現(xiàn)還未知,或者說某些步驟的實現(xiàn)與具體的環(huán)境相關(guān)。 定義與特點模板方法(Template Method)模式的定義如下:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。它是一種類行為型模式。 該模式的主要優(yōu)點如下:
該模式的主要缺點如下:
結(jié)構(gòu)與實現(xiàn)模板方法模式需要注意抽象類與具體子類之間的協(xié)作。它用到了虛函數(shù)的多態(tài)性技術(shù)以及“不用調(diào)用我,讓我來調(diào)用你”的反向控制技術(shù)。 模式的結(jié)構(gòu)模板方法模式包含以下主要角色: 抽象類(Abstract Class):負(fù)責(zé)給出一個算法的輪廓和骨架。它由一個模板方法和若干個基本方法構(gòu)成,這些方法的定義如下:
具體子類(Concrete Class):實現(xiàn)抽象類中所定義的抽象方法和鉤子方法,它們是一個頂級邏輯的一個組成步驟。 模板方法模式的結(jié)構(gòu)圖如圖所示:
模式的實現(xiàn)模板方法模式的代碼如下: class Program
{
static void Main(string[] args)
{
AbstractClass tm=new ConcreteClass();
tm.TemplateMethod();
Console.Read();
}
}
//抽象類
public abstract class AbstractClass
{
public void TemplateMethod() //模板方法
{
SpecificMethod();
AbstractMethod1();
AbstractMethod2();
}
public void SpecificMethod() //具體方法
{
Console.WriteLine("抽象類中的具體方法被調(diào)用...");
}
public abstract void AbstractMethod1(); //抽象方法1
public abstract void AbstractMethod2(); //抽象方法2
}
//具體子類
public class ConcreteClass : AbstractClass
{
public override void AbstractMethod1()
{
Console.WriteLine("抽象方法1的實現(xiàn)被調(diào)用...");
}
public override void AbstractMethod2()
{
Console.WriteLine("抽象方法2的實現(xiàn)被調(diào)用...");
}
}程序的運行結(jié)果如下: 抽象類中的具體方法被調(diào)用... 抽象方法1的實現(xiàn)被調(diào)用... 抽象方法2的實現(xiàn)被調(diào)用... 應(yīng)用場景模板方法模式通常適用于以下場景:
擴展:重寫鉤子方法在模板方法模式中,基本方法包含:抽象方法、具體方法和鉤子方法,正確使用“鉤子方法”可以使得子類控制父類的行為。如下面例子中,可以通過在具體子類中重寫鉤子方法 HookMethod1() 和 HookMethod2() 來改變抽象父類中的運行結(jié)果,其結(jié)構(gòu)圖如圖所示:
程序代碼如下: class Program
{
static void Main(string[] args)
{
HookAbstractClass tm = new HookConcreteClass();
tm.TemplateMethod();
Console.Read();
}
}
//含鉤子方法的抽象類
public abstract class HookAbstractClass
{
public void TemplateMethod() //模板方法
{
AbstractMethod1();
HookMethod1();
if(HookMethod2())
{
SpecificMethod();
}
AbstractMethod2();
}
public void SpecificMethod() //具體方法
{
Console.WriteLine("抽象類中的具體方法被調(diào)用...");
}
public virtual void HookMethod1(){} //鉤子方法1
public virtual bool HookMethod2() //鉤子方法2
{
return true;
}
public abstract void AbstractMethod1(); //抽象方法1
public abstract void AbstractMethod2(); //抽象方法2
}
//含鉤子方法的具體子類
public class HookConcreteClass : HookAbstractClass
{
public override void AbstractMethod1()
{
Console.WriteLine("抽象方法1的實現(xiàn)被調(diào)用...");
}
public override void AbstractMethod2()
{
Console.WriteLine("抽象方法2的實現(xiàn)被調(diào)用...");
}
public override void HookMethod1()
{
Console.WriteLine("鉤子方法1被重寫...");
}
public override bool HookMethod2()
{
return false;
}
}
|
|
|