状态模式的应用:
比如在游戏中,英雄的状态系统就使用了状态模式。每个英雄都有不同的状态,例如正常状态、眩晕状态、沉默状态等等。不同的状态对应不同的行为和效果,例如在眩晕状态下无法移动和施放技能,在沉默状态下无法使用技能。使用狂暴,会增加自身属性等;为了实现这个功能,王者荣耀使用了状态模式,将每个状态封装在不同的状态类中,然后在运行时动态地切换状态对象。在这里插入代码片
下面是一个简单的示例代码:
interface IHeroState
{
void Move();
void CastSkill();
void ChangeInfo();
}
class NormalState : IHeroState
{
public void CastSkill()
{
Console.WriteLine("英雄在正常状态下移动");
}
public void Move()
{
Console.WriteLine("英雄在正常状态下释放技能");
}
public void ChangeInfo()
{
Console.WriteLine("属性不变");
}
}
// 晕眩状态
class StunState : IHeroState
{
public void CastSkill()
{
Console.WriteLine("英雄在眩晕状态下无法释放技能");
}
public void Move()
{
Console.WriteLine("英雄在眩晕状态下无法移动");
}
public void ChangeInfo()
{
Console.WriteLine("属性不变");
}
}
// 狂暴状态
class RageState : IHeroState
{
public void ChangeInfo()
{
Console.WriteLine("属性提升");
}
public void CastSkill()
{
Console.WriteLine("狂暴下使用技能");
}
public void Move()
{
Console.WriteLine("狂暴下移动");
}
}
internal class Program
{
static void Main(string[] args)
{
Hero hero = new Hero();
//正常状态
hero.SetState(new NormalState());
hero.Move();
hero.CastSkill();
//狂暴
hero.SetState(new RageState());
hero.ChangeInfo();
hero.Move();
hero.CastSkill();
}
}
// 英雄类
class Hero
{
// 英雄的状态
private IHeroState _state;
// 英雄的移动
public void Move()
{
_state.Move();
}
// 英雄的释放技能
public void CastSkill()
{
_state.CastSkill();
}
//属性变化
public void ChangeInfo()
{
_state.ChangeInfo();
}
// 设置英雄的状态
public void SetState(IHeroState state)
{
_state = state;
}
}