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
    收藏
    关注
    评论
  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4862759.html
Copyright © 2011-2022 走看看