程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 重構桌面飄著聖誕老人

重構桌面飄著聖誕老人

編輯:關於.NET

讀大學時寫的桌面飄著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;
    }
  }
}

這個程序研究起來還是很有意思,肯定還有更好的方法,歡迎大家批評,這樣不僅可以在實際項目中采用設計模式設計出更合理的軟件架構,更重要的是它還能給我們帶來快樂。

全部源代碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved