讀大學時寫的桌面飄著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;
}
}
}
這個程序研究起來還是很有意思,肯定還有更好的方法,歡迎大家批評,這樣不僅可以在實際項目中采用設計模式設計出更合理的軟件架構,更重要的是它還能給我們帶來快樂。
全部源代碼