DOTA版设计模式——建造者
建造者模式哦,提供了一系列的方法对产品进行处理,可以选择其中的方法进行任意组合,不过要写好建造者模式代码需要有很强的业务知识哦。最后得到相应的产品就可以了。
UML图:
UML图可以看到Builder中包含产品的建造和获取,Director向导来决定如何建造产品。
对于Dota中Model的建造来说需要实现以下接口IBuilder,包括创建模型,增加名称,设置技能,贴图。这里没有列举全有兴趣的同学可以自行补充完整。
internal interface IBuilder
{
void CreateModel();
void AddName();
void SetSkill();
void Maps();
}
主角是我们的Builder,在构造函数中实例化Model对象,其中包含了IBuilder中的全部建造过程。Model类见完整代码。
public class ModelBuilder : IBuilder
{
private Model _model;
public ModelBuilder()
{
_model = new Model();
}
public Model GetModel()
{
return _model;
}
#region IBuilder 成员
public void CreateModel()
{
_model.AddProperty("CreateModel", "CreateModel");
}
public void AddName()
{
_model.AddProperty("AddName", "AddName");
}
public void SetSkill()
{
_model.AddProperty("SetSkill", "SetSkill");
}
public void Maps()
{
_model.AddProperty("Maps", "Maps");
}
#endregion
}
测试代码:
DotaPatternLibrary.Builder.ModelBuilder mbObj = new DotaPatternLibrary.Builder.ModelBuilder();
mbObj.CreateModel();
mbObj.AddName();
mbObjNew.Maps();
DotaPatternLibrary.Builder.Model model = mbObj.GetModel();
model.Show();
DotaPatternLibrary.Builder.ModelBuilder mbObjNew = new DotaPatternLibrary.Builder.ModelBuilder();
mbObjNew.CreateModel();
mbObjNew.AddName();
mbObjNew.SetSkill();
mbObjNew.Maps();
model = mbObjNew.GetModel();
model.Show();
测试代码中一个是数的,一个是英雄的,两个建造过程差了SetKill方法,因为树是不需要技能的。
完整代码:
UML图:
UML图可以看到Builder中包含产品的建造和获取,Director向导来决定如何建造产品。
对于Dota中Model的建造来说需要实现以下接口IBuilder,包括创建模型,增加名称,设置技能,贴图。这里没有列举全有兴趣的同学可以自行补充完整。
internal interface IBuilder
{
void CreateModel();
void AddName();
void SetSkill();
void Maps();
}
主角是我们的Builder,在构造函数中实例化Model对象,其中包含了IBuilder中的全部建造过程。Model类见完整代码。
public class ModelBuilder : IBuilder
{
private Model _model;
public ModelBuilder()
{
_model = new Model();
}
public Model GetModel()
{
return _model;
}
#region IBuilder 成员
public void CreateModel()
{
_model.AddProperty("CreateModel", "CreateModel");
}
public void AddName()
{
_model.AddProperty("AddName", "AddName");
}
public void SetSkill()
{
_model.AddProperty("SetSkill", "SetSkill");
}
public void Maps()
{
_model.AddProperty("Maps", "Maps");
}
#endregion
}
测试代码:
DotaPatternLibrary.Builder.ModelBuilder mbObj = new DotaPatternLibrary.Builder.ModelBuilder();
mbObj.CreateModel();
mbObj.AddName();
mbObjNew.Maps();
DotaPatternLibrary.Builder.Model model = mbObj.GetModel();
model.Show();
DotaPatternLibrary.Builder.ModelBuilder mbObjNew = new DotaPatternLibrary.Builder.ModelBuilder();
mbObjNew.CreateModel();
mbObjNew.AddName();
mbObjNew.SetSkill();
mbObjNew.Maps();
model = mbObjNew.GetModel();
model.Show();
测试代码中一个是数的,一个是英雄的,两个建造过程差了SetKill方法,因为树是不需要技能的。
完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using DotaCommon;
namespace DotaPatternLibrary.Builder
{
internal interface IBuilder
{
void CreateModel();
void AddName();
void SetSkill();
void Maps();
}
public class ModelBuilder : IBuilder
{
private Model _model;
public ModelBuilder()
{
_model = new Model();
}
public Model GetModel()
{
return _model;
}
#region IBuilder 成员
public void CreateModel()
{
_model.AddProperty("CreateModel", "CreateModel");
}
public void AddName()
{
_model.AddProperty("AddName", "AddName");
}
public void SetSkill()
{
_model.AddProperty("SetSkill", "SetSkill");
}
public void Maps()
{
_model.AddProperty("Maps", "Maps");
}
#endregion
}
public class Model
{
Hashtable htObj = new Hashtable();
internal void AddProperty(string key, string value)
{
htObj.Add(key, value);
}
public void Show()
{
foreach (string value in htObj.Values)
{
LandpyForm.Form.OutputResult(value);
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using DotaCommon;
namespace DotaPatternLibrary.Builder
{
internal interface IBuilder
{
void CreateModel();
void AddName();
void SetSkill();
void Maps();
}
public class ModelBuilder : IBuilder
{
private Model _model;
public ModelBuilder()
{
_model = new Model();
}
public Model GetModel()
{
return _model;
}
#region IBuilder 成员
public void CreateModel()
{
_model.AddProperty("CreateModel", "CreateModel");
}
public void AddName()
{
_model.AddProperty("AddName", "AddName");
}
public void SetSkill()
{
_model.AddProperty("SetSkill", "SetSkill");
}
public void Maps()
{
_model.AddProperty("Maps", "Maps");
}
#endregion
}
public class Model
{
Hashtable htObj = new Hashtable();
internal void AddProperty(string key, string value)
{
htObj.Add(key, value);
}
public void Show()
{
foreach (string value in htObj.Values)
{
LandpyForm.Form.OutputResult(value);
}
}
}
}