zoukankan      html  css  js  c++  java
  • 简历复印 原型模式

    9.1 夸张的简历

    9.2 简历代码的初步实现

    namespace 原型模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Resume a = new Resume("大鸟");
                a.SetPersonalInfo("", "29");
                a.SetWorkExperience("1998-2000", "XX公司");
    
                Resume b = new Resume("大鸟");
                b.SetPersonalInfo("", "29");
                b.SetWorkExperience("1998-2000", "XX公司");
    
                Resume c = new Resume("大鸟");
                c.SetPersonalInfo("", "29");
                c.SetWorkExperience("1998-2000", "XX公司");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
            }
        }
    
        //简历
        class Resume
        {
            private string name;
            private string sex;
            private string age;
            private string timeArea;
            private string company;
    
            public Resume(string name)
            {
                this.name = name;
            }
    
            //设置个人信息
            public void SetPersonalInfo(string sex, string age)
            {
                this.sex = sex;
                this.age = age;
            }
    
            //设置工作经历
            public void SetWorkExperience(string timeArea, string company)
            {
                this.timeArea = timeArea;
                this.company = company;
            }
    
            //显示
            public void Display()
            {
                Console.WriteLine("{0} {1} {2}", name, sex, age);
                Console.WriteLine("工作经历:{0} {1}", timeArea, company);
            }
        }
    
    }
    View Code

    9.3 原型模式

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,

    原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节,

    namespace 原型模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcretePrototype1 p1 = new ConcretePrototype1("I");
                ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();   //克隆类ConcretePrototype1的实例p1就能得到新的实例c1,
                Console.WriteLine("Cloned: {0}", c1.Id);
    
                ConcretePrototype2 p2 = new ConcretePrototype2("II");
                ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
                Console.WriteLine("Cloned: {0}", c2.Id);
    
                Console.Read();
    
            }
        }
    
        abstract class Prototype
        {
            private string id;
    
            // Constructor 
            public Prototype(string id)
            {
                this.id = id;
            }
    
            // Property 
            public string Id
            {
                get { return id; }
            }
    
            //抽象类关键就是有这样一个Clone方法,
            public abstract Prototype Clone();
        }
    
        class ConcretePrototype1 : Prototype
        {
            // Constructor 
            public ConcretePrototype1(string id)
                : base(id)
            {
    
            }
    
            public override Prototype Clone()
            {
                // Shallow copy 
                return (Prototype)this.MemberwiseClone();
            }
        }
    
    
        class ConcretePrototype2 : Prototype
        {
            // Constructor 
            public ConcretePrototype2(string id)
                : base(id)
            {
    
            }
    
            public override Prototype Clone()
            {
                // Shallow copy 
                return (Prototype)this.MemberwiseClone();   //创建当前对象的浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象,
            }                                               //如果字段是值类型的,则对该对象执行逐位复制,
        }                                                   //如果字段是引用类型的,则复制引用但不复制引用的对象,
                                                            //因此,原始对象及其副本引用同一对象,
    
    }
    View Code

    .NET在System命名空间中提供了ICloneable接口,只有一个方法Clone( ),只需要实现这个接口就可以完成原型模式了,

    9.4 简历的原型模式

    namespace 原型模式
    {
        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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetPersonalInfo("", "24");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
            }
        }
    
        //简历
        class Resume : ICloneable
        {
            private string name;
            private string sex;
            private string age;
            private string timeArea;
            private string company;
    
            public Resume(string name)
            {
                this.name = name;
            }
    
            //设置个人信息
            public void SetPersonalInfo(string sex, string age)
            {
                this.sex = sex;
                this.age = age;
            }
    
            //设置工作经历
            public void SetWorkExperience(string timeArea, string company)
            {
                this.timeArea = timeArea;
                this.company = company;
            }
    
            //显示
            public void Display()
            {
                Console.WriteLine("{0} {1} {2}", name, sex, age);
                Console.WriteLine("工作经历:{0} {1}", timeArea, company);
            }
    
            public Object Clone()
            {
                return (Object)this.MemberwiseClone();
            }
        }
    
    }
    View Code

    每NEW一次,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次执行这个初始化就实在是太低效了,一般在初始化的信息不发生变化的情况下,克隆是最好的办法,既隐藏了对象创建的细节,又对性能是大大的提高,

    9.5 浅复制与深复制

    MemberwiseClone( )方法是这样,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象,因此,原始对象及其副本引用同一对象,

    namespace 原型模式
    {
        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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetPersonalInfo("", "24");
                c.SetWorkExperience("1998-2003", "ZZ企业");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
            }
        }
    
        //简历
        class Resume : ICloneable
        {
            private string name;
            private string sex;
            private string age;
    
            private WorkExperience work;
    
            public Resume(string name)
            {
                this.name = name;
                work = new WorkExperience();
            }
    
            //设置个人信息
            public void SetPersonalInfo(string sex, string age)
            {
                this.sex = sex;
                this.age = age;
            }
    
            //设置工作经历
            public void SetWorkExperience(string workDate, string company)
            {
                work.WorkDate = workDate;
                work.Company = company;
            }
    
            //显示
            public void Display()
            {
                Console.WriteLine("{0} {1} {2}", name, sex, age);
                Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company);
            }
    
            public Object Clone()
            {
                return (Object)this.MemberwiseClone();
            }
    
        }
    
        //工作经历
        class WorkExperience
        {
            private string workDate;
    
            public string WorkDate
            {
                get { return workDate; }
                set { workDate = value; }
            }
    
            private string company;
    
            public string Company
            {
                get { return company; }
                set { company = value; }
            }
        }
    
    }
    View Code

    浅复制,被复制对象的所有变量都含有与原来对象相同的值,而所有的对其它对象的引用都仍然指向原来的对象,

    深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象,

    9.6 简历的深复制实现

    namespace 原型模式
    {
        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-2006", "YY企业");
    
                Resume c = (Resume)a.Clone();
                c.SetWorkExperience("1998-2003", "ZZ企业");
    
                a.Display();
                b.Display();
                c.Display();
    
                Console.Read();
            }
        }
    
        //简历
        class Resume : ICloneable
        {
            private string name;
            private string sex;
            private string age;
    
            private WorkExperience work;
    
            public Resume(string name)
            {
                this.name = name;
                work = new WorkExperience();
            }
    
            private Resume(WorkExperience work)   //提供Clone方法调用的私有构造函数,以便克隆工作经历数据,
            {
                this.work = (WorkExperience)work.Clone();
            }
    
            //设置个人信息
            public void SetPersonalInfo(string sex, string age)
            {
                this.sex = sex;
                this.age = age;
            }
    
            //设置工作经历
            public void SetWorkExperience(string workDate, string company)
            {
                work.WorkDate = workDate;
                work.Company = company;
            }
    
            //显示
            public void Display()
            {
                Console.WriteLine("{0} {1} {2}", name, sex, age);
                Console.WriteLine("工作经历:{0} {1}", work.WorkDate, 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;
            }
        }
    
        //工作经历
        class WorkExperience : ICloneable   //工作经历类实现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()   //工作经历类实现Clone方法,
            {
                return (Object)this.MemberwiseClone();
            }
        }
    
        //DataSet Clone() and Copy()
                  //浅复制    //深复制
    
    }
    View Code

    9.7 复制简历VS手写求职信

  • 相关阅读:
    《闲扯Redis十》Redis 跳跃表的结构实现
    《闲扯Redis九》Redis五种数据类型之Set型
    《闲扯Redis八》Redis字典的哈希表执行Rehash过程分析
    《闲扯Redis七》Redis字典结构的底层实现
    《闲扯Redis六》Redis五种数据类型之Hash型
    js定时器为什么是不精确的
    单页面应用的优缺点(SPA)
    怎么减少http请求次数
    animation 和 transition 的区别
    akka-typed(9)
  • 原文地址:https://www.cnblogs.com/huangxuQaQ/p/11272501.html
Copyright © 2011-2022 走看看