在一個主項目中,經常會放置多個子功能的入口,這些入口有可能是按鈕,有可能是下拉菜單。
初始開發起來,肯定很輕松,在界面上放置一個按鈕,給它一個名字,然后到他的Click事件中編寫一段代碼,讓子功能的界面彈出。
但是隨著子功能的不斷變多,這個毫不起眼的幾個小工作,我們在不停重復的進行。
最頭疼的是,突然有一天,你的PM跟你說,這個界面不要了,或者是這個子功能的入口換成另一個窗體的時候,你已經不記得這不起眼的幾行代碼在哪里了。
這樣的設計模式,也是初學者最容易走的開發方式。
我們從邏輯上來分析,功能模塊應該是由其自身決定在界面上顯示什么內容,自己應該以何種方式被打開。
想象一下我們的Windows操作系統,每一個程序的圖標,以及圖標上的文字,都應當由程序各自來決定,而不是操作系統,只有這樣,這些圖標、文字、甚至于其存在,都可以輕松得進行修改。
我們可以模仿Windows的做法,比如圖標啦、文字啦、以及打開后"要做什么事",這些東西全部做成一個接口
1 /// <summary> 2 /// 定義一個接口,用于描述一個子功能模塊 3 /// </summary> 4 public interface ISubMoudle 5 { 6 /// <summary> 7 /// 功能名稱 8 /// </summary> 9 string ModuleName { get; }10 11 /// <summary>12 /// 圖標文件的路徑,若不使用圖標,則返回空字符或null13 /// </summary>14 string ICONPath { get; }15 16 /// <summary>17 /// 打開這個功能模塊18 /// </summary>19 void Open();20 }
我們以后制作的所有子功能模塊都實現該接口,舉個例子
1 /// <summary> 2 /// 一個顯示當前時間的子功能 3 /// </summary> 4 public class ShowTimeMoudle :ISubMoudle 5 { 6 7 public string ModuleName 8 { 9 get { return "顯示時間"; }10 }11 12 public string ICONPath13 {14 get { return ""; }15 }16 17 public void Open()18 {19 Console.WriteLine(DateTime.Now.ToString());20 }21 }
功能內的主要內容,都在Open方法中體顯。
子功能已經定義好了
讓我們來趕緊使用它吧
首先,要主功能模塊中,我們要有一個列表
列表中詳細地記錄了所有的ISubMoudle對像
然后,我們動態地,將這些內容輸出到一個窗體、一個控制臺或一個Web中去,我們以控制臺為例
1 static void Main(string[] args) 2 { 3 List<ISubMoudle> moudleList = new List<ISubMoudle>(); 4 moudleList.Add(new ShowTimeMoudle()); 5 6 //開始將moudleList中的所有功能開始輸出 7 for (int i = 0; i < moudleList.Count; i++) 8 { 9 Console.WriteLine("{0} : {1}", i + 1, moudleList[i].ModuleName);10 }11 12 Console.ReadLine();13 }
子功能已經動態地顯示出來了,我們準備使用前面對應的數字,進行各個自功能。
其實就是,我們分析錄入的字符,轉化為數字類型,在moudleList中對找對應的位置,然后調用其Open()方法
1 List<ISubMoudle> moudleList = new List<ISubMoudle>(); 2 moudleList.Add(new ShowTimeMoudle()); 3 4 //開始將moudleList中的所有功能開始輸出 5 for (int i = 0; i < moudleList.Count; i++) 6 { 7 Console.WriteLine("{0} : {1}", i + 1, moudleList[i].ModuleName); 8 } 9 10 string cmd = Console.ReadLine();11 int j = int.Parse(cmd);12 ISubMoudle moudle = moudleList[j - 1];13 moudle.Open();14 15 Console.ReadLine();
10 - 13行是追加的代碼
以上,就是演示了接口的另一種用法 : 動態地擴展你的程序,將你開發的關注點僅僅放在功能模塊內部
在這里,我們以運行時的方式,將所有的子模塊輸出到了控制臺界面上:
新聞熱點
疑難解答