簡介:
框架是一種定制的通用的應用程序開發基礎軟件,在其基礎上可以開發完整的關且功能完善的軟件。在最近幾年裡,已經成功實現了某些應用領域的開發框架,比如說用戶介面開發及數據訪問開發等。如果能成功的開發出一個框架,這將是一個突破,因為這意味著開發將不再從頭開始實現某個功能:比如一個框架如果可以成功的生成一個用戶介面,哪麼它也能生成做任意的用戶介面。例如,假如我們使用java Applets 和servlets,我們僅僅需要重寫某些方法,就可以實現我們自己的代碼。這其中java Applets和servlets就是我們所使用的框架平台。Microsoft也實現了MFC類庫存,還有本文涉及的.net Framework (當然還用Borland的vcl)。
先決條件:
本文的讀者應該有c#的使用經驗,或者對java applet 和 servlet有基礎的了解,以便可以理解本文所涉及的一些基本概念。
工具:
本文所寫代碼在windows 2000+.net Framework 發行版下測試。因為本文不需要圖形介面,所以我使用寫字板及c#命令行編譯器實現。
正文:
在下面,你將看到如何實現一個應用程序框架模型的基礎構造。開發應用框架時的基本核心就是template方法,它被隱藏在應用程序裡面,控制應用程序的運行。它只在基類裡面實現並且不能被改變。
第一步就是構建框架的基類。在構建框架時基類是最重要的類。
它裡面有可以被重寫的方法,最終用戶可以重寫這些方法以實現他們自己的應用程序。除了這些,這裡還有一個template方法用於在框架進程中控制。我們將要構建的框架包括三個需要最終用戶實現的抽象方法。他們是init,run和destroy.,它們必須要順序實現。下面就是我們實現的代碼:
// 這個類之所以被定義為抽象類,是因為用戶方法還沒有被實現 abstract class AppFramework { // 構造器調用template方法 public AppFramework() { templateMethod(); } // 下面的方法需要最終用戶實現 public abstract void init(); public abstract void run(); public abstract void destroy(); //template方法是框架的核心 private void templateMethod() { Console.WriteLine("Initializing Template Engine"); // template 方法順序調用所需要的方法 init(); run(); destroy(); Console.WriteLine("Ending Template Engine"); } }
請不要將template方法寫為虛方法,因為這將給最終用戶修改template方法的能力從而改變了整個框架的基礎。也就是說這僅是框架開發都需要完成的任務,最終用戶要做的就是從框架基類繼承並重寫這些在框架中定義的抽象類以實現自己定制的功能。
// 從基類繼承 class MyClass : AppFramework { // 將抽象方法重寫以實現定制的功能 override public void init() { Console.WriteLine("MyClass::init"); } override public void run() { Console.WriteLine("MyClass::run"); } override public void destroy() { Console.WriteLine("MyClass::destroy"); } // the main method defined public static void Main(String [] arg) { MyClass myClass = new MyClass(); } }
盡管Main()函數與這些重寫的函授放在一個類中是可行的,但最好是放在一個單獨的類中。下面是全部的代碼.
<code> 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 { override public void init() { Console.WriteLine("MyClass::init"); } override public void run() { Console.WriteLine("MyClass::run"); } override public void destroy() { Console.WriteLine("MyClass::destroy"); } public static void Main(String [] arg) { MyClass myClass = new MyClass(); } }