讀大學時寫的桌面飄著Love(完全用GDI+繪制的),現在想讓桌面飄著聖誕老人,其實稍微研究下,大家都會寫,於是我想讓代碼更優美點。
如果想讓桌面既飄著Love又飄著聖誕老人,怎麼辦呢,象裝飾模式?不過不是。如果我想讓程序全部封裝成dll後,別人也能用很簡單的代碼進行擴展,怎麼辦呢?於是我定義好了整個結構,可以繼承類然後寫很簡單的程序完成功能,無需修改我的類,可以支持運行時"熱插拔"要顯示到桌面飄著的Fly(比如通過配置app.config).
先看效果圖吧:
上面是飄著聖誕老人
上面是飄著LOVE
上面是飄著LOVE和聖誕老人一起
上面是右鍵關於或者退出
上面是關於
上面是類圖
上面是程序結構圖
由於多種原因,我電腦WORD都沒,所以沒什麼好的畫圖工具好表達上面的類圖的關系。
其中ProxyImage類中采用了策略模式對采用什麼圖片進行出來。
在上面類圖中:第一個注釋裡說:“MainForm發送[多個]裝載圖片的命令給ProxyImage,而ProxyImage只返回[一個]圖片給MainForm。”為什麼是返回一個圖片呢,原因有兩點:第一:一個ILIST<>的一個對象只能裝一個。第二:如果用其他方式返回兩個,則會出現這種情況:如果顯示LOVE,桌面可以飄100個,但如果桌面同時飄LOVE和聖誕老人,則桌面會飄著:200個,如果以後擴展,桌面飄著很多個,那桌面將會成為:N*100個,這個肯定不能這樣。於是綜合一些設計模式,我改造了下,變成現在我的程序的樣子了。
如果我的程序全部編譯為類庫DLL文件了,要想擴展也非常方便。有兩種情況:第一:用GDI+繪制圖片,比如我這裡的LOVE。第二:直接用圖片。
第一種情況,擴展的類繼承GdiImage抽象類,重載DrawImage方法,這個方法沒有其它任何額外的代碼,只做GDI+繪制;
第二種情況,擴展的類直接繼承IImage接口,實現GetBitmap方法就行了。
如果想讓桌面飄著的物體在運行時加載它,則可配置相應的配置文件則可。
程序中起橋梁作用的proxyImage類的代碼如下:
proxyImage類代碼
#region 版權 /* * 版權歸Lawson所有 * QQ:313769823 * Blog:lawson.cnblogs.com */ #endregion using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Text; namespace Main { /// <summary> /// 負責桌面飄動的圖片處理 /// </summary> public class ProxyImage { private static Hashtable imageList = new Hashtable(); /// <summary> /// 默認構造函數 /// </summary> public ProxyImage() { //無操作 } /// <summary> /// 添加圖片種類 /// </summary> /// <param name="image">圖片類型</param> public static void AddImage(IImage image) { imageList.Add(imageList.Count + 1, image); } /// <summary> /// 獲取圖片 /// </summary> /// <returns>圖片</returns> public static Image GetImage() { object obj = null; Image result = null; if (imageList.Count == 1) { obj = imageList[1]; } else { Random random = new Random(); obj = imageList[random.Next(1, imageList.Count)]; } if (obj == null) { //防止擴展圖片時,引用生成圖片類而沒先實例化它 throw new Exception("添加生成圖片類時請先實例化該類"); } obj = obj as IImage; if (obj != null) { result = ((IImage)obj).GetBitmap(); } else { throw new Exception("GetImage時出錯誤了,您可以把給錯誤發送給我:)"); } return result; } } }
這個程序研究起來還是很有意思,肯定還有更好的方法,歡迎大家批評,這樣不僅可以在實際項目中采用設計模式設計出更合理的軟件架構,更重要的是它還能給我們帶來快樂。
全部源代碼