C#《大话设计模式》之原型模式学习日记

class Program
    {
        static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetPersonalInfo("", "29");
            a.SetWorkExperience("1998-2000", "xx公司");



            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("1998-2000", "hh公司");
            Resume c = (Resume)a.Clone();
            c.SetWorkExperience("1998-2000", "pp公司");
            a.Display();
            b.Display();
            c.Display();
            Console.ReadKey();
        }
    }
    class WorkExperence:ICloneable
    {
        private string  workDate;

        public string  WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;

        public string Company
        {
            get { return company; }
            set { company = value; }
        }

        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }
    class Resume:ICloneable
    {
        private string name;
        private string sex;
        private string age;

        private WorkExperence work;

        public Resume(string _name)
        {
            this.name = _name;
            work = new WorkExperence();
        }

        //此处也不再采用构造函数开始拷贝引用类型
        //private Resume(WorkExperence _work)
        //{
        //    this.work = (WorkExperence)_work.Clone();
        //}

        public void SetPersonalInfo(string _sex,string _age)
        {
            this.sex = _sex;
            this.age = _age;
        }
        public void SetWorkExperience(string _timeArea,string _company)
        {
            work.WorkDate = _timeArea;
            work.Company = _company;
        }
        public void Display()
        {
            Console.WriteLine("{0} {1} {2}", this.name, this.sex, this.age);
            Console.WriteLine("工作经历:{0},{1}", this.work.WorkDate, this.work.Company);
        }

        public object Clone()
        {

            //《大话设计模式》的深层拷贝的实现方法
            //Resume obj = new Resume(this.work);
            //obj.name = this.name;
            //obj.sex = this.sex;
            //obj.age = this.age;
            //return obj;


            //注:此处未采用《大话设计模式》的拷贝方式,而采用先拷贝该类的值类型,在拷贝引用类型的值类型,以此类推
            //直到最深层全部拷贝为止,此例子仅两层。  采用这种方式代码简单易懂,效率高
            object obj = this.MemberwiseClone();
            (obj as Resume).work = (WorkExperence)this.work.Clone();
            return obj;


            //return (object)this.MemberwiseClone();
        }
    }

 

posted on 2018-02-01 09:03  鲁广广  阅读(131)  评论(0编辑  收藏  举报

导航