享元模式-讓手機短信聊天更方便

享元模式比喻
每天跟MM發短信,手指都累死了,最近買了個新手機,可以把一些常用的句子存在手機裏,要用的時候,直接拿出來,在前面加上MM的名字就可以發送了,再不用一個字一個字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特徵,根據上下文情況使用。

享元模式意圖
享元模式(Flyweight)用用共享技術有效地支持大量細密度的對象。

享元模式類圖


享元模式實現

/// <summary>
    /// 所有常用句子的超類或接口,通過這個接口可以接受並作用於外部狀態
    /// </summary>
    abstract class Sentence
    {
        public abstract void Operation();
    }

    /// <summary>
    /// 繼承Sentence超類或實現Sentence接口,併爲內部狀態增加操作
    /// </summary>
    class FlyweightSentence : Sentence
    {
        private string word = "";
        public FlyweightSentence(string word)
        {
            this.word = word;
        }

        public override void Operation()
        {
            Console.WriteLine(word);
        }
    }

    /// <summary>
    /// 那些不共享的句子,繼承Sentence超類爲共享成爲可能,但是並不強制共享
    /// </summary>
    class UnsharedSentence : Sentence
    {
        private string word = "";
        public UnsharedSentence(string word)
        {
            this.word = word;
        }

        public override void Operation()
        {
            Console.WriteLine(word);
        }
    }

    /// <summary>
    /// 一個享元句子工廠,用來創建並管理句子對象,主要是用來確保合理地共享常用句子。
    /// 當用戶使用某一個句子時,SentenceManager對象提供一個已經創建的實例,如果不存在則創建一個。
    /// </summary>
    class SentenceManager
    {
        private Hashtable sentences = new Hashtable();//享元句子集
        public Hashtable Sentences
        {
            get { return sentences; }
            set { sentences = value; }
        }
        /// <summary>
        /// 初始化時先生成三個實例
        /// </summary>
        public SentenceManager()
        {
            //遇到過生日時要說一些生日快樂方面的祝福
            sentences.Add("生日", new FlyweightSentence("生日快樂……"));

            //遇到過情人節時要說一些情人節快樂方面的祝福
            sentences.Add("情人節", new FlyweightSentence("情人節快樂……"));
            
            //遇到過元旦時要說一些元旦快樂方面的祝福
            sentences.Add("元旦", new FlyweightSentence("元旦快樂……"));
        }

        /// <summary>
        /// 根據客戶端請求獲得已生成的實例
        /// </summary>
        public Sentence GetSentence(string key)
        {
            return (Sentence)Sentences[key];
        }
    }


    /// <summary>
    /// 享元模式客戶端應用
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            SentenceManager sm = new SentenceManager();

            //今天朱利IT博客過生日,發一個祝福短信吧
            Sentence fs = sm.GetSentence("生日");
            //在前面加上MM的名字
            Console.Write("朱利IT博客");
            //發送短信
            fs.Operation();

            //哎呦,她沒有我的電話號碼,忘記了添加我的署名了
            UnsharedSentence us = new UnsharedSentence("我是你的粉絲,……");
            us.Operation();

            //春節快到了,趕緊收集一條春節的短信
            FlyweightSentence newFlyweightSentence = new FlyweightSentence("春節快樂……");
            sm.Sentences.Add("春節", newFlyweightSentence);

            Console.Read();
        }
    }

享元模式總結
一些常用的大量的句子存在手機裏用的時候直接用真是方便!在某些情況下,對象的數量可能會很多,從而導致運行時資源與性能損耗,享元模式可以運用共享技術有效地支持大量細密度的對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章