• C#-设计模式-状态模式


    1.定义

    很多时候,我们的程序可能又许多状态(比如页面上的功能就有增删改查四种状态),每种状态要执行的操作可能不一样,一般情况下,我们会使用if判断状态,然后在代码块中执行适当的代码,但是一旦业务逻辑很复杂的时候,这样做就很难维护。

    状态模式其实和策略模式很类似,

    策略模式是将会经常改变的算法抽象出来,通过不同的实现类来达到更换算法的功能。

    而状态模式呢,经常会改变的是状态,我们就需要将状态和对应的行为抽象出来,方便状态的改变。

    2.代码实现

    public interface State
    {
        void DealHttpRequest();
    }
    
    public class AddState : State
    {
        public void DealHttpRequest()
        {
            throw new NotImplementedException();
        }
    }
    
    public class DelState : State
    {
        public void DealHttpRequest()
        {
            throw new NotImplementedException();
        }
    }
    
    public class UpdateState : State
    {
        public void DealHttpRequest()
        {
            throw new NotImplementedException();
        }
    }

    上面的代码和策略模式很像,都是将变化的部分进行抽象。

    调用的时候,这样:

    public void Main()
    {
        IHttpContextAccessor _contextAccessor = new HttpContextAccessor();
        var QueryCollection = _contextAccessor.HttpContext.Request.Query;
        var stateStr = QueryCollection["state"].ToString();
        var state = GetState(stateStr);
        state.DealHttpRequest();
    }
    
    private State GetState(string state)
    {
        switch (state)
        {
            case "add":
                return new AddState();
            case "del":
                return new DelState();
            case "update":
                return new UpdateState();
            default:
                return null;
        }
    }

    通过判断状态的不同,然后做出不同的动作。当有新状态的时候,我们需要对接口提供一个新的实现,并且还需要修改GetState方法。

    这里虽然还是对原有方法进行了修改,但是这也是没有办法的事情。

    3.特点

    优点:将和状态绑定的变化进行抽象封装,当遇到新的状态时只需要将修改状态工厂,并实现一个新的状态类即可。

    缺点:可能会引入很多状态类(有时候设计成内部类挺好的)

    策略模式和状态模式的区别:其实这两个模式实现起来是很像的,都是对变化进行抽象,区别我个人觉得是,策略模式关注点在于策略的变化,这种变化是需要替换原有的实现。

    但是状态模式不是,状态模式是多种实现在程序运行中都有可能遇到。

    也就是说策略模式在程序中选择一种策略进行使用,但还是状态模式所有的状态都会使用。

    4.一点想法

    我个人觉得状态模式就是将状态和他的行为抽象出来,还是需要使用if或者switch来判断到底是那一种状态,而且这种状态多的时候,if和switch的长度也会很长。

    我看到过一种另类的实现方法,链接

    这种模式将if判断也进行了分割,将状态的判断也放在状态类内部进行,实现出的结果我觉得很惊喜,但是个人还是觉得这里的逻辑和引用方式过于繁琐,如果是没有深入学习过该模式的人恐怕很难理解。

    因此不在这里再说了(说实话,使用该方法写的例子至今跑不对,尴尬)

  • 相关阅读:
    常用的正则表达式
    vue多页面应用
    webpack + jquery + bootstrap 环境配置
    Goroutine的几个例子
    设置css通用字体
    简单的gulpfile.js参数配置
    1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
    github上比较全的知识
    秒杀倒计时
    正则校验手机号码并获取手机验证码倒计时的实例
  • 原文地址:https://www.cnblogs.com/gamov/p/10535608.html
Copyright © 2020-2023  润新知