首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

桌面漂浮特效重構實戰:策略模式與代理模式打造可熱插拔的擴展架構

     編輯:關於.NET

專案背景

大學時期用 GDI+ 繪製「桌面飄著 Love」,如今欲重構支援「聖誕老人」等多種漂浮物件,並要求:

  • 核心邏輯封裝為 DLL,第三方無需修改原始碼即可擴展
  • 執行時透過設定檔 (app.config) 動態載入漂浮物件類型
  • 多種漂浮物件同時運行時,總數量受控不失控

架構設計:核心類別圖

類別圖

程式結構圖

關鍵介面與抽象類別

  • IImage:統一介面,定義 GetBitmap() 取得漂浮圖片
  • GdiImage:抽象基類,針對 GDI+ 繪製場景,子類別只需覆寫 DrawImage()
  • ProxyImage:代理單例,管理所有已註冊漂浮物件,隨機回傳單一圖片實例

ProxyImage 核心邏輯:策略模式 + 數量控制

public class ProxyImage
{
    private static Hashtable imageList = new Hashtable();

    public static void AddImage(IImage image)
    {
        imageList.Add(imageList.Count + 1, image);
    }

    public static Image GetImage()
    {
        if (imageList.Count == 0) throw new Exception("請先註冊漂浮物件類型");

        object obj = imageList.Count == 1
            ? imageList[1]
            : imageList[new Random().Next(1, imageList.Count + 1)];

        if (obj is IImage img) return img.GetBitmap();
        throw new Exception("類型轉換失敗");
    }
}

設計精髓:無論註冊幾種漂浮物件,MainForm 每次只請求 一張 圖片。避免「註冊 N 種物件 → 桌面同時出現 N×100 個」的失控情況。

擴展指南:兩種開發模式

模式一:GDI+ 程式化繪圖 (繼承 GdiImage)

public class LoveImage : GdiImage
{
    public override void DrawImage(Graphics g, Rectangle rect)
    {
        // 僅專注 GDI+ 繪製邏輯,無其他樣板碼
        g.DrawString("Love", new Font("Arial", 12), Brushes.Red, rect);
    }
}

模式二:直接使用圖片資源 (實作 IImage)

public class SantaImage : IImage
{
    public Image GetBitmap()
    {
        return Properties.Resources.Santa; // 直接回傳 Bitmap
    }
}

執行時熱插拔:App.config 設定

<appSettings>
  <add key="FlyTypes" value="MyAssembly.LoveImage, MyAssembly; MyAssembly.SantaImage, MyAssembly" />
</appSettings>

啟動時反射實例化並註冊:

foreach (string typeName in ConfigurationManager.AppSettings["FlyTypes"].Split(';'))
{
    Type t = Type.GetType(typeName.Trim());
    ProxyImage.AddImage((IImage)Activator.CreateInstance(t));
}

執行效果展示

聖誕老人漂浮

Love 漂浮

混合漂浮

右鍵選單

關於視窗

總結

透過 代理模式統一出口、策略模式封裝繪圖演算法、介面導向設計,實現了:

  1. 核心 DLL 零修改擴展新漂浮物件
  2. 執行時動態組合漂浮類型
  3. 桌面物件總數可控,不隨類型增加而膨脹
  4. GDI+ 繪製與圖片資源兩種擴展模式並存
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved