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

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

使用情况:
(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();
        }
    }
}

我们开始受理,开始备货
用户取消订单
货物不喜欢,取消订单
我们开始受理,开始备货
备货完成,我们开始发货
检查货物,没问题就签收了
收获成功
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值