设计模式——状态模式

最近在项目开发过程中,接触到了状态设计模式。自己也去百度了一下,大概看了一下,写了一个demo。

状态模式:允许一个对象在其内部状态改变时改变它的行为

当状态少的时候,我们会觉得不用设计模式也是可以的,但是状态增多的时候,这样会使我们的代码很乱,不利于程序的扩展。

状态模式可以把每一个状态抽象为一个类,通过继承状态接口,内置每个状态对应的处理逻辑,事物通过不同的条件,*切换

为不同状态。

我们以 人为例子。人的心情有好有坏。好坏就是人的两个状态。而导致这两种状态进行切换的原因很多,我们就拿工作业绩来举

个例子吧。业绩好心情就好,业绩差工资低心情就会差。这里以枚举类型来表示:

public enum WorkPerformence
{
    WELL,
    BAD
}

我们把人 抽象为一个事物

public class People
{
    private IStates _state;
    //切换心情的方法
    public void SetState(IStates state)
    {
        _state = state;
    }
    //调用不同心情的处理办法
    public void Hand(WorkPerformence arg)
    {
        _state.HandleState(arg);
    }

}

有一个状态接口:

public interface IStates
{
    void HandleState(WorkPerformence arg);
}

开心和不开心 为两种状态:HappyState和SadState

public class HappyState : IStates
{
    //指定为谁切换状态
    private People _people;
    public HappyState(People people)
    {
        _people = people;
    }
    public void HandleState(WorkPerformence arg)
    {
        Debug.Log("工作业绩好,想花钱开心");
        if (arg!=WorkPerformence.WELL)
        {
            //工作业绩不好,切换心情
            _people.SetState(new SadState(_people));
        }
       
    }
}

public class SadState : IStates
{
    private People _people;
    public SadState(People people)
    {
        _people = people;
    }
    public void HandleState(WorkPerformence arg)
    {
        Debug.Log("工作业绩不好,没工资不开心");
        if (arg!=WorkPerformence.BAD)
        {
            //工作业绩好,切换想花钱状态
            _people.SetState(new HappyState(_people));
        }
        
    }
}

我们来测试一下人的两种状态是否能*切换,首先设置人为开心状态,当业绩好的时候,会输出工作业绩好,想花钱开心。

之后业绩差,因为我们的状态此时还是开心状态,还是会输出工作业绩好,想花钱开心。之后由于业绩差,所以我们状态就切换为坏的状态。

private void Start()
    {
        People people = new People();
        people.SetState(new HappyState(people));

        people.Hand(WorkPerformence.WELL);
        people.Hand(WorkPerformence.BAD);
        people.Hand(WorkPerformence.BAD);
        people.Hand(WorkPerformence.WELL);
        people.Hand(WorkPerformence.WELL);

    }

设计模式——状态模式