当前位置: 首页 > news >正文

网站微信付款调用/楚雄百度推广电话

网站微信付款调用,楚雄百度推广电话,什么网站做品牌特卖,广西哪家公司做网站的在之前的文章中我们讲了简单工厂模式,策略模式,单一职责原则,开放封闭原则,依赖倒转原则,装饰模式,代理模式,抽象工厂模式,上一节在抽象工程模式中讲了利用工厂模式创建英雄的过程,今天我将带大家用原型模式模拟一下魔兽世界里面的怪物创建,其…

在之前的文章中我们讲了简单工厂模式,策略模式,单一职责原则,开放封闭原则,依赖倒转原则,装饰模式,代理模式,抽象工厂模式,上一节在抽象工程模式中讲了利用工厂模式创建英雄的过程,今天我将带大家用原型模式模拟一下魔兽世界里面的怪物创建,其实我平时很少玩游戏的,但是我喜欢对游戏进行分析,下面就讲一下设计思路:

我要模拟的是这样的场景,模拟游戏地图中的出怪功能:

地图中创建怪,也许一次不止要创建一个怪,而是创建一批怪,怎么编程才能让我们的游戏耗的资源小一点呢,对于大型的游戏,系统配置是玩游戏的瓶颈所在:

最易想到的就是用for循环去创建一批怪,但是这样每次创建一个怪,都要new一次,这样明显的是不太合理的。

下面我就讲一下如何用原型模式来解决这个问题;

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

在其它语言中如果想使用原型模式,必须要在要被克隆的类中定义Clone接口,然后在具体的类中去实现这个接口。

因为我用的.NET,在.net里面,Clone方法实现用是太多了,所以.NET在System下定义了ICloneable接口,其中就是唯一的一个方法,Clone,所以在使用的过程中我们只要实现Clone接口就可以了。

下面是我模拟的代码,贴出来和大家分享下:

/// <summary>/// 怪物类/// </summary>abstract class Monster{/// <summary>/// 怪物类构造函数/// </summary>/// <param name="name"></param>public Monster(string name){this.name = name;}private string name;/// <summary>/// 怪物名称/// </summary>public string Name{get { return name; }set { name = value; }}/// <summary>/// 怪物类型/// </summary>private string monsterType;public string MonsterType{get { return monsterType; }set { monsterType = value; }}/// <summary>/// 怪物攻击力/// </summary>private int attack;public int Attack{get { return attack; }set { attack = value; }}private int defence;/// <summary>/// 怪物防御力/// </summary>public int Defence{get { return defence; }set { defence = value; }}/// <summary>/// 设置怪物的熟悉值/// </summary>public void SetProperty(string type,int attack,int defence){this.monsterType = type;this.attack = attack;this.defence = defence;}public void SetSkill(string skillName,int defence,int attack){skill.SkillName = skillName;skill.Defence = defence;skill.Attack = attack;}public Skill skill = new Skill();/// <summary>/// 显示技能属性值/// </summary>public void Display(){Console.WriteLine(string.Format("怪物名称:{0}\n怪物类型:{1};\n怪物攻击里:{2};\n怪物防御力:{3};\n怪物技能:{4};\n技能攻击力:{5};\n技能防御力:{6}\n------------------------------",this.Name,this.MonsterType,this.Attack,this.Defence,this.skill.SkillName,this.skill.Attack,this.skill.Defence));}public abstract Monster Clone();public Monster(Skill skill){this.skill = (Skill)skill.Clone();}}
细心的你也许发现我没有使用.NET提供的ICloneable接口,是的,这样是方便别的语言的朋友看,所以自己就写了,下面这个技能类就是我继承微软提供的,贴出代码

 /// <summary>/// 技能类/// </summary>class Skill:ICloneable{private string skillName;/// <summary>///技能名称/// </summary>public string SkillName{get { return skillName; }set { skillName = value; }}private int attack;/// <summary>/// 技能攻击力/// </summary>public int Attack{get { return attack; }set { attack = value; }}private int defence;/// <summary>/// 技能防御力/// </summary>public int Defence{get { return defence; }set { defence = value; }}/// <summary>/// 克隆新的技能/// </summary>/// <returns></returns>public object Clone(){return (Skill)this.MemberwiseClone();}}
具体要创建的怪类,继承怪物类的总类
   class DarkTroll:Monster{/// <summary>/// 黑暗巨魔/// </summary>/// <param name="name"></param>public DarkTroll(string name):base(name){}/// <summary>/// 黑暗巨魔/// </summary>/// <param name="name"></param>public DarkTroll(Skill skill0): base(skill0){}/// <summary>/// 克隆怪物方法/// </summary>/// <returns></returns>public override Monster Clone(){///创建当前对象的浅表副本,方法是创建一个新对象,然后将这个对象的非静态对象复制到新对象中,如果该字段是值类型,则对该字段进行逐一复制,///如果是引用类型,则复制应用不复制引用对象,因此原始对象极其副本引用同一对象。///Monster obj = new DarkTroll(base.skill);obj.Name = this.Name;obj.MonsterType = this.MonsterType;obj.Attack = this.Attack;obj.Defence = this.Defence;return obj;}}

在这里重点提心一下:MemberwiseClone()方法如果对象中的字段是值类型,就将该字段进行逐位复制,如果是引用类型,则是复制引用而不复制值。这样的话就会出现问题,如果由于游戏的需求,同一种怪物随机出两个不同的技能中的一种,如果用Clone()方法去实现的话,那么永远都只有一种技能,这个取决于最后一次引用中存放的值。

所以在复制的过程中出现了浅复制和深复制之分,浅复制只用于值类型,深复制就比较复杂一点,需要在需要变动的类中重新实现ICloneable接口,

 /// <summary>/// 克隆新的技能/// </summary>/// <returns></returns>public object Clone(){return (Skill)this.MemberwiseClone();}

以此来改变这一点,同时变换还有就是在引用类中必须重新改变Clone方法的写法:

 /// <summary>/// 克隆怪物方法/// </summary>/// <returns></returns>public override Monster Clone(){///创建当前对象的浅表副本,方法是创建一个新对象,然后将这个对象的非静态对象复制到新对象中,如果该字段是值类型,则对该字段进行逐一复制,///如果是引用类型,则复制应用不复制引用对象,因此原始对象极其副本引用同一对象。///Monster obj = new DarkTroll(base.skill);obj.Name = this.Name;obj.MonsterType = this.MonsterType;obj.Attack = this.Attack;obj.Defence = this.Defence;return obj;}

到此为止我们的原型模式就讲完了。

其实在我们日常编程中原型模式我们用的挺多了,比如说我们用的数据集对象DataSet,它就是一个Clone和一个Copy方法,Clone用来复制DataSet结构,但不复制DataSet数据,实现原型模式的浅复制,Copy方法不止复制了结构而且复制了数据,其实它就是原型模式的一个深复制。

Darren  www.tianboo.net


http://www.jmfq.cn/news/4988611.html

相关文章:

  • 专业做公司宣传网站的/关键词排名点击软件怎样
  • 佛山专业网站建设/重庆网站制作公司
  • 南阳市做网站/信息互联网推广
  • 如何低成本做网站推广/北京seo关键词排名优化
  • wordpress 定时/什么是网站seo
  • 哪个网站可以做片头/网站怎么做优化排名
  • 网站建设如何网络销售/搜索引擎培训班
  • 网页广告素材/黑帽seo优化
  • 网站建设价位/广州谷歌推广
  • 桂林有哪些做网站的电话/百度一下下载安装
  • 商标注册需要多久/深圳seo关键词优化
  • 做网站后付款/青海seo技术培训
  • 网站内链符号/企业网站源码
  • DW做网站入门步骤教学/聊石家庄seo
  • 安平县做网站的有哪些/北京建站公司
  • 制作论坛做网站/网址大全百度
  • 青岛模板做网站/天津网站策划
  • 怎么做网站可手机看/全国人大常委会
  • 美丽寮步网站建设价钱/创建网站步骤
  • 公众号建网站/好用的seo软件
  • 上海营销型网站建设公司/seo网络推广机构
  • 做网站需要前置审批/网站seo 优化
  • 淘宝现在不能发布网站建设/公司业务推广
  • 17网站一起做网店怎么下单/百度关键词搜索怎么弄
  • 重庆工厂网站建设/成都网络推广运营公司
  • 网站开发报价说明/站长工具友链检测
  • 网站正在建设中 公告/百度推广seo优化
  • 龙溪网站建设哪家便宜/营销广告文案
  • 官方网站建设 招标公告/成都网站维护
  • 洛阳网站建设行业/游戏推广代理平台