代码改变世界

结合项目实例 回顾传统设计模式(十)状态模式

2011-10-07 09:34  熬夜的虫子  阅读(637)  评论(0编辑  收藏  举报

谈到状态模式我们在这里所谈论的是一个通用的技巧:如何对对象内的状态建模----通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同状态。我们要把一个状态的所有行为放在一个类中。这么一来我们将行为局部化了,并使得事情更容易改变和理解。

虫子还是拿订单系统来说事了

 

/// <summary>
    
/// 状态接口
    
/// </summary>
    public interface SimpleState
    {
        //检查购物车
        void CheckCart();
        //检查账号
        void CheckAcount();
        //提交订单
        void OrderSumbit();
    }

    public class Order
    {
        //初始状态
        SimpleState initsate;
        //待审核状态
        SimpleState Pendingsate;
        //提交后状态
        SimpleState submittedsate;

        public Order()
        {
            initsate = new InitState(this);
            Pendingsate = new Pendingsate(this);
            submittedsate = new submittedsate(this);
        }

        private SimpleState state;

        public void setState(SimpleState state)
        {
            this.state = state;
        }

        public SimpleState getInitState()
        {
            return initsate;
        }
        public SimpleState getPendingsate()
        {
            return Pendingsate;
        }
        public SimpleState getsubmittedsate()
        {
            return submittedsate;
        }

    }

    public class InitState : SimpleState
    {
        Order order;
        public InitState(Order order)
        {
            this.order = order;
        }
        public void CheckCart()
        {
            Console.WriteLine("订单进入初始状态");
            order.setState(order.getInitState());
        }
        public void CheckAcount()
        {
            Console.WriteLine("订单进入待审核状态");
            order.setState(order.getPendingsate());
        }
        public void OrderSumbit()
        {
            Console.WriteLine("该状态不能进入此步骤");           
        }

      
    }

    public class Pendingsate : SimpleState
    {
        Order order;
        public Pendingsate(Order order)
        {
            this.order = order;
        }
        public void CheckCart()
        {
            Console.WriteLine("该状态不能进入此步骤");
        }
        public void CheckAcount()
        {
            Console.WriteLine("订单进入待审核状态");
            order.setState(order.getPendingsate());
        }
        public void OrderSumbit()
        {
            Console.WriteLine("订单进入提交状态");
            order.setState(order.getsubmittedsate());
        }
    }

    public class submittedsate : SimpleState
    {
        Order order;
        public submittedsate(Order order)
        {
            this.order = order;
        }
        public void CheckCart()
        {
            Console.WriteLine("该状态不能进入此步骤");
        }
        public void CheckAcount()
        {
            Console.WriteLine("该状态不能进入此步骤");       
        }
        public void OrderSumbit()
        {
            Console.WriteLine("订单进入提交状态");
            order.setState(order.getsubmittedsate());
        }
    }

 

总结:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。因为这个模式将状态封装成独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态改变而改变。从客户的视角来看,如果你使用的对象能够完全改变它的行为,那么你会觉得,这个对象实际上市用别的类实例化而来的。然而,实际上,我们是在使用组合通过简单引用不同的状态对象来造成类改变的假象。