重構案頭飄著聖誕老人,利用策略模式和改造的代理模式讓軟體完全實現開閉原則,歡迎下載原始碼分析

來源:互聯網
上載者:User

讀大學時寫的案頭飄著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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.