飞道的博客

c#设计模式-行为性模式-7.状态模式

228人阅读  评论(0)

状态模式就是一个对象的状态改变时,它的行为也会改变

使用情况:
(1)、对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。

(2)、代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态

比如:1个订单,用户下单,商家受理,商家发货,确认收货,收货成功这几个状态,当然用户也可以选择取消订单(不签收)的状态

通过实现同一个State接口来交互来达到解耦

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 状态模式
{
   
    public sealed class  Order
    {
   
        private State currentState;

        public bool IsCancel {
    get; set; }

        public Order()
        {
   
            currentState = new WaintForAccept();
            IsCancel = false;
        }
        private double minute;
        public double Minute
        {
   
            get {
    return minute; }
            set {
    minute = value; }
        }
        private bool finish;
        public bool Finish
        {
   
            get {
    return finish; }
            set {
    finish = value; }
        }
        public void SetState(State s)
        {
   
            currentState = s;
        }
        public void Action()
        {
   
            currentState.Process(this);
        }
    }

    public interface State
    {
   
        void Process(Order order);
    }
    //等待受理状态-具体状态角色
    public sealed class WaintForAccept : State
    {
        
        public void Process(Order order)
        {
   
            Console.WriteLine("我们开始受理,开始备货");
            //接受半个小时之内可以取消订单
            if (order.Minute < 30 && order.IsCancel)
            {
   
                Console.WriteLine("用户取消订单");
                order.SetState(new CancelOrder());
                order.Action();
                return;
            }            
            order.SetState(new AcceptAndDeliver());
            order.Finish = false;
            order.Action();
        }
    }
    //受理发货
    public sealed class AcceptAndDeliver : State
    {
   
        public void Process(Order order)
        {
   
            Console.WriteLine("备货完成,我们开始发货");
            if (order.Minute < 30 && order.IsCancel)
            {
   
                Console.WriteLine("用户取消订单");
                order.SetState(new CancelOrder());
                order.Action();
                return;
            }          
            if(order.Finish==false)
            {
   
                order.SetState(new ConfirmReceipt());
                order.Action();
            }            
        }
    }
    //确认收货
    public sealed class ConfirmReceipt : State
    {
   
        public void Process(Order order)
        {
   
            Console.WriteLine("检查货物,没问题就签收了");
            order.SetState(new Success());
            order.Action();
        }
    }
    //收货成功
    public sealed class Success : State
    {
   
        public void Process(Order order)
        {
   
            Console.WriteLine("收获成功");
            order.Finish = true;
        }
    }
    //取消订单
    public sealed class CancelOrder : State
    {
   
        public void Process(Order order)
        {
   
            Console.WriteLine("货物不喜欢,取消订单");
            order.Finish = false;
        }
    }

    class Program
    {
   
        static void Main(string[] args)
        {
   
            Order order = new Order();
            order.IsCancel = true;
            order.Minute = 20;
            order.Action();
            Order order1 = new Order();
            order1.IsCancel = false;
            order1.Minute = 33;
            order1.Action();
            Console.ReadKey();
        }
    }
}

我们开始受理,开始备货
用户取消订单
货物不喜欢,取消订单
我们开始受理,开始备货
备货完成,我们开始发货
检查货物,没问题就签收了
收获成功

转载:https://blog.csdn.net/weixin_44453949/article/details/117048302
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场