享元模式-让手机短信聊天更方便

享元模式比喻
每天跟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();
        }
    }

享元模式总结
一些常用的大量的句子存在手机里用的时候直接用真是方便!在某些情况下,对象的数量可能会很多,从而导致运行时资源与性能损耗,享元模式可以运用共享技术有效地支持大量细密度的对象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章