• DOTA版设计模式——模板方法


    模板方法比较简单,实际上就是在一个抽象类中写N个方法,其中包括abstract方法和已经实现的方法。模板方法就是已经实现的方法,而abstract方法是交由子类实现的。
    UML图:

    本文中的例子是创建Dota模型的例子,英雄和等级低的野怪有什么区别?区别在英雄有技能,等级低的野怪没有技能。下面会是创建模型的过程:
    CreateModel(创建3D模型)->SetSkill(设置技能)->SetPosition(设置位置)->Maps(贴图)。
    可以看出,除了设置技能外其他的过程都是公用的,所以抽象出模板方法BuildModel,SetSkill方法在子类中实现:
        public abstract class Model
        {
            
    public void CreateModel()
            {
                LandpyForm.Form.OutputResult(
    "CreateModel");
            }

            
    public abstract void SetSkill();

            
    public void SetPosition()
            {
                LandpyForm.Form.OutputResult(
    "SetPosition");
            }

            
    public void Maps()
            {
                LandpyForm.Form.OutputResult(
    "Maps");
            }
            
    //模板方法
            public void BuildModel()
            {
                CreateModel();
                SetSkill();
                SetPosition();
                Maps();
            }
        }
    SetSkill方法由于英雄和等级低的野怪不同所以由子类来实现:
        public class Hero : Model
        {
            
    public override void SetSkill()
            {
                LandpyForm.Form.OutputResult(
    "SetSkill");
            }
        }

        
    public class SmallBotWildNPC : Model
        {
            
    public override void SetSkill()
            {
                LandpyForm.Form.OutputResult(
    "NoSkill");
            }
        }
    测试代码:
                LandpyForm.Form.OutputResult("Hero");
                DotaPatternLibrary.TemplateMethod.Model model = new DotaPatternLibrary.TemplateMethod.Hero();
                model.BuildModel();
                LandpyForm.Form.OutputResult("BotWildNPC");
                model = new DotaPatternLibrary.TemplateMethod.SmallBotWildNPC();
                model.BuildModel();
    完整代码不用贴出,上边的代码均已包括。
    以下是变形模板方法,数组排序,包括Framework实现和自己的实现:
    using System;

    class Starter
    {
        
    static void Main()
        {
            
    //Person personPxl = new Person("pxl", 27);
            
    //Person personLjc = new Person("ljc", 26);
            
    //Person personWwh = new Person("wwh", 25);
            
    //Person personYkl = new Person("ykl", 24);

            
    //Person[] persons = { personWwh, personPxl, personLjc, personYkl };
            
    //Array.Sort(persons);
            
    //foreach (Person person in persons)
            
    //{
            
    //    Console.WriteLine("Name:{0}-Age:{1}", person.Name, person.Age);
            
    //}

            LandpyPerson personPxl 
    = new LandpyPerson("pxl"27);
            LandpyPerson personLjc 
    = new LandpyPerson("ljc"26);
            LandpyPerson personWwh 
    = new LandpyPerson("wwh"25);
            LandpyPerson personYkl 
    = new LandpyPerson("ykl"24);

            LandpyPerson[] persons 
    = { personWwh, personPxl, personLjc, personYkl };
            LandpyArray
    <LandpyPerson>.Sort(persons);
            
    foreach (LandpyPerson person in persons)
            {
                Console.WriteLine(
    "Name:{0}-Age:{1}", person.Name, person.Age);
            }

            Console.ReadKey();
        }
    }

    class Person : IComparable<Person>
    {
        
    private string _name;
        
    private int _age;

        
    public string Name
        {
            
    get { return _name; }
            
    set { _name = value; }
        }

        
    public int Age
        {
            
    get { return _age; }
            
    set { _age = value; }
        }

        
    public Person(string name, int age)
        {
            _name 
    = name;
            _age 
    = age;
        }

        
    public int CompareTo(Person other)
        {
            
    //调用Int的CompareTo方法
            
    //return this.Age.CompareTo(other.Age);
            
    //自己写Int的CompareTo方法
            if (this.Age < other.Age)
            {
                
    return -1;
            }
            
    else if (this.Age > other.Age)
            {
                
    return 1;
            }
            
    else
            {
                
    return 0;
            }
        }
    }

    interface ILandpyComparable<T>
    {
        
    int CompareTo(T t);
    }

    class LandpyPerson : ILandpyComparable<LandpyPerson>
    {
        
    private string _name;
        
    private int _age;

        
    public string Name
        {
            
    get { return _name; }
            
    set { _name = value; }
        }

        
    public int Age
        {
            
    get { return _age; }
            
    set { _age = value; }
        }

        
    public LandpyPerson(string name, int age)
        {
            _name 
    = name;
            _age 
    = age;
        }

        
    public LandpyPerson()
        {
        }

        
    /// <summary>
        
    /// 1为大于;0为等于;-1为小于
        
    /// </summary>
        
    /// <param name="other"></param>
        
    /// <returns></returns>
        public int CompareTo(LandpyPerson other)
        {
            
    if (this.Age > other.Age)
            {
                
    return 1;
            }
            
    else if (this.Age < other.Age)
            {
                
    return -1;
            }
            
    else
            {
                
    return 0;
            }
        }
    }

    class LandpyArray<T>
    {
        
    public static void Sort(T[] comparers)
        {
            
    int tmp;
            
    //冒泡法排序
            for (int step = 0; step < comparers.Length - 1; step++)
            {
                
    for (int index = 0; index < comparers.Length - 1 - step; index++)
                {
                    tmp 
    = (comparers[index] as ILandpyComparable<T>).CompareTo(comparers[index + 1]);
                    
    if (tmp == 1)
                    {
                        T t 
    = Activator.CreateInstance<T>();
                        t 
    = comparers[index];
                        comparers[index] 
    = comparers[index + 1];
                        comparers[index 
    + 1= t;
                    }
                }
            }
        }
    }
  • 相关阅读:
    常用git命令及问题解决方法
    angular router-ui
    lodash接触:string-capitalize
    angular-ui-router状态不变刷新页面
    ubuntu安装bower失败的解决方法
    HTTP协议中PUT和POST使用区别 【转载】
    CentOS6.5配置python开发环境之一:CentOS图形化界面显示
    SQL Server 查询Job中的存储过程(转)
    sql 取每月第一天或最后一天
    getdate() 转换格式大全
  • 原文地址:https://www.cnblogs.com/pangxiaoliang/p/1531596.html
Copyright © 2020-2023  润新知