zoukankan      html  css  js  c++  java
  • 状态模式

    定义

    将对象的状态抽象成类,通过对象状态的改变来改变对象自身的行为状态。核心在于将状态抽象,状态的转换改变对象的状态行为。

    下面举个很简单的例子:通过状态模式对订单进行控制,假设订单有这样的一个流程机制:新增----审核---提交----结束,相邻状态之间可以相互转换。

    类图

    代码

     public class OrderInfo
        {
            public OrderState orderState = new NewState();   ///默认新增状态
            
            public OrderInfo(OrderState state)
            {
                orderState = state;
            }
            public void SetPreview()
            {
                if (orderState != null)
                {
                    orderState.SetPreviewState(this);
                }
            }
            public void SetNext()
            {
                if (orderState != null)
                {
                    orderState.SetNextState(this);
                }
            }
        }
        public abstract class OrderState
        {
            public abstract void SetPreviewState(OrderInfo orderInfo);
            public abstract void SetNextState(OrderInfo orderInfo);
        }
        public class NewState : OrderState
        {
    
            public override void SetNextState(OrderInfo orderInfo)
            {
                Console.WriteLine("审核成功");
                orderInfo.orderState = new CheckState();
    
            }
            public override void SetPreviewState(OrderInfo orderInfo)
            {
                ///没有上一个状态了
            }
        }
        public class CheckState : OrderState
        {
    
            public override void SetNextState(OrderInfo orderInfo)
            {
                Console.WriteLine("审核成功");
                orderInfo.orderState = new NewState();
            }
            public override void SetPreviewState(OrderInfo orderInfo)
            {
                Console.WriteLine("取消审核成功");
                orderInfo.orderState = new NewState();
            }
        }
        public class SummitState : OrderState
        {
    
            public override void SetNextState(OrderInfo orderInfo)
            {
                Console.WriteLine("订单完成");
                orderInfo.orderState = new CheckState();
            }
            public override void SetPreviewState(OrderInfo orderInfo)
            {
                Console.WriteLine("回退订单成功");
                orderInfo.orderState = new CheckState();
            }
        }
        public class FinishState : OrderState
        {
    
            public override void SetNextState(OrderInfo orderInfo)
            {
                Console.WriteLine("订单已经结束");
            }
            public override void SetPreviewState(OrderInfo orderInfo)
            {
    
            }
        }

    总结

    代码还是非常简单,当然订单当中还可以加入很多逻辑处理。状态模式侧重在于状态,在于对象状态的改变来控制对象的行为。而不是面向过程式的通过对象自身来控制状态,如果以这种形式,将会出现比较多的判断。

    Top
    收藏
    关注
    评论
  • 相关阅读:
    VS Code中格式化插件Prettier-Code Formatter设置
    module5-online-jQuery关于动态轮播图的制作
    module5-jQuery 快速网页交互开发
    module5-05-jQuery 事件操作和插件
    module5-04-jQuery 节点操作和元素尺寸
    module5-03-jQuery 排序、入口函数与动画
    选配CPU的时候,最好带上孩子,学会选择才能把握机遇
    选配显示器时带上孩子,体验选配的乐趣,培养财商从细节开始
    家用电脑升级选配硬盘时带上孩子,体验选配,培养财商从细节开始
    科普文,选配内存,常识分享
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4862759.html
Copyright © 2011-2022 走看看