State Pattern

来源:互联网 发布:淘宝淘宝军军用口粮 编辑:程序博客网 时间:2024/06/05 05:23

  定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。


using System;using System.Threading;using System.Windows.Forms;using System;using System.Drawing;using System.Collections.Generic;using System.Windows.Forms;namespace ThreadPoolTest{    abstract class State    {        protected Hero hero;        public State(Hero hero)        {            this.hero=hero;        }        public abstract void BloodPlus(int dot);        public abstract void BloodMinus(int dot);        protected abstract void StatusChange(int blood_num);    }    class DeathState : State//已经死了的情况  0    {        public DeathState(Hero hero) : base(hero)         {            Console.WriteLine("死了");            if (hero.blood < 0)                hero.blood = 0;        }        public override void BloodPlus(int dot)        {            Console.WriteLine("英雄已死,没法加血");        }        public override void BloodMinus(int dot)        {            Console.WriteLine("英雄已死,没法减血");        }        protected override void StatusChange(int blood_num)        {            Console.WriteLine("永远不会走到这里的");        }    }    class RedState : State//血不多的情况   1 2 3    {        public RedState(Hero hero) : base(hero) { Console.WriteLine("红了"); }        public override void BloodMinus(int dot)        {            hero.blood -= dot;            StatusChange(hero.blood);        }        public override void BloodPlus(int dot)        {            hero.blood += dot;            StatusChange(hero.blood);        }        protected override void StatusChange(int blood_num)        {            if (blood_num <= 0)                hero.state = new DeathState(hero);            else if (blood_num >= 4)                hero.state = new BlueState(hero);        }    }    class BlueState : State//血较多的情况  4    {        public BlueState(Hero hero) : base(hero)         {            Console.WriteLine("绿了");            if (hero.blood > 4)                hero.blood = 4;        }        public override void BloodMinus(int dot)        {            hero.blood -= dot;            StatusChange(hero.blood);        }        public override void BloodPlus(int dot)        {            Console.WriteLine("满血,不需要加血");        }        protected override void StatusChange(int blood_num)        {            if (blood_num <= 0)                hero.state = new DeathState(hero);            else if (blood_num <= 3)                hero.state = new RedState(hero);        }    }    class Hero    {        public int blood;//英雄血的点数,最高为4,为0表示已经死亡        public State state;        public Hero()        {            blood = 4;            state = new BlueState(this);            Console.WriteLine("一个新英雄,满血4");        }        public void BloodDrop(int dot)//掉血        {            state.BloodMinus(dot);        }        public void BloodInc(int dot)//补血        {            state.BloodPlus(dot);        }    }    class MainApp    {        static void Main()        {            Hero pig = new Hero();            Console.WriteLine(pig.blood);            pig.BloodInc(1);            Console.WriteLine(pig.blood);            pig.BloodInc(3);            Console.WriteLine(pig.blood);            pig.BloodDrop(3);            Console.WriteLine(pig.blood);            pig.BloodInc(2);            Console.WriteLine(pig.blood);            pig.BloodInc(5);            Console.WriteLine(pig.blood);            pig.BloodDrop(2);            Console.WriteLine(pig.blood);            pig.BloodDrop(2);            Console.WriteLine(pig.blood);            pig.BloodDrop(2);            Console.WriteLine(pig.blood);            pig.BloodDrop(2);            Console.WriteLine(pig.blood);            pig.BloodDrop(2);            Console.WriteLine(pig.blood);                           }    }}