码迷,mamicode.com
首页 > 其他好文 > 详细

状态模式

时间:2015-10-09 01:54:54      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

定义

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

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

类图

技术分享

代码

 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)
        {

        }
    }

总结

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

状态模式

标签:

原文地址:http://www.cnblogs.com/Joy-et/p/4862759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!