讀大學時寫的案頭飄著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;
}
}
}
這個程式研究起來還是很有意思,肯定還有更好的方法,歡迎大家批評,這樣不僅可以在實際項目中採用設計模式設計出更合理的軟體架構,更重要的是它還能給我們帶來快樂。
(還可以找個png聖誕老人圖片做個自己的屏保了哦:))
全部原始碼:
/Files/Lawson/Fly.rar
既飄著聖誕老人也飄著LOVE(exe檔案)
/Files/Lawson/Main.rar
飄著聖誕老人(exe檔案)
/Files/Lawson/Christmas.rar
飄著LOVE(exe檔案)
/Files/Lawson/gdi.rar