一颗不安分的创业心

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方法,因为树是不需要技能的。
完整代码:
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);
            }
        }
    }
}
posted @ 2009-07-26 23:04  pangxiaoliang[北京]流浪者  阅读(369)  评论(0编辑  收藏  举报
小豆芽之父