框架為定製化通用應用程式開發基礎軟體,基於此可開發功能完善軟體。近年成功實現特定領域開發框架(使用者介面、資料存取等)。成功開發框架意謂開發不再從頭開始:能生成使用者介面的框架,也能生成任意介面。Java Applets/Servlets 即框架平台範例,微軟 MFC、.NET Framework 同屬此類。
開發應用框架核心為 template 方法,隱藏於應用程式內控制執行流程。僅在基底類別實現且不可被改變。
基底類別為框架最重要類別,包含可被重寫方法供最終使用者實現自訂功能,以及控制流程的 template 方法。框架包含三個需使用者實現的抽象方法:init、run、destroy,必須順序執行。
abstract class AppFramework
{
public AppFramework() { templateMethod(); }
public abstract void init();
public abstract void run();
public abstract void destroy();
private void templateMethod()
{
Console.WriteLine("Initializing Template Engine");
init();
run();
destroy();
Console.WriteLine("Ending Template Engine");
}
}
關鍵:templateMethod 不可寫為 virtual,否則賦予使用者修改框架基礎能力。使用者僅需繼承基底類別並重寫抽象方法實現定製功能。
class MyClass : AppFramework
{
public override void init() { Console.WriteLine("MyClass::init"); }
public override void run() { Console.WriteLine("MyClass::run"); }
public override void destroy() { Console.WriteLine("MyClass::destroy"); }
public static void Main(string[] arg)
{
MyClass myClass = new MyClass(); // 建構時自動執行 template 流程
}
}
雖 Main() 可與重寫方法同類別,但最好分離獨立類別。
using System;
abstract class AppFramework
{
public AppFramework() { templateMethod(); }
public abstract void init();
public abstract void run();
public abstract void destroy();
private void templateMethod()
{
Console.WriteLine("Initializing Template Engine");
init(); run(); destroy();
Console.WriteLine("Ending Template Engine");
}
}
class MyClass : AppFramework
{
public override void init() { Console.WriteLine("MyClass::init"); }
public override void run() { Console.WriteLine("MyClass::run"); }
public override void destroy() { Console.WriteLine("MyClass::destroy"); }
public static void Main(string[] arg) { MyClass myClass = new MyClass(); }
}
此框架展示 Template Method 設計模式在 C# 中的經典應用,為應用程式提供固定執行骨架,延伸點由子類別實現。