C# 设计模式 状态设计模式例子

该博客介绍了如何运用状态设计模式来管理不同订单状态,包括新建订单、已支付和已发货状态。通过订单上下文类,实现了状态的切换,并展示了每个状态下的相应行为。这种模式允许在不修改对象本身的情况下改变对象的行为,但可能会增加系统状态类的数量和复杂性。
摘要由CSDN通过智能技术生成

请添加图片描述

1、状态接口

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

namespace StateModule
{
    /// <summary>
    /// 状态设计模式 接口
    /// </summary>
    public interface IState
    {
        void handle();
    }
}

2、具体状态1

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

namespace StateModule
{
    /// <summary>
    /// 新建订单状态
    /// </summary>
    public class NewOrderState : IState
    {
        public void handle()
        {
            Console.WriteLine("新订单、未支付");
            Console.WriteLine("调用商户客服服务,有新订单\n");
        }
    }
}

3、具体状态2

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

namespace StateModule
{
    /// <summary>
    /// 已支付订单状态
    /// </summary>
    public class PayOrderState : IState
    {
        public void handle()
        {
            Console.WriteLine("新订单、已支付");
            Console.WriteLine("通知商户客服服务,订单已经支付");
            Console.WriteLine("调用物流服务、未发货\n");
        }
    }
}

4、具体状态3

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

namespace StateModule
{
    /// <summary>
    /// 已经发货状态
    /// </summary>
    public class SendOrderState : IState
    {
        public void handle()
        {
            Console.WriteLine("订单已经发货");
            Console.WriteLine("调用短信服务、告诉用户已经发货");
            Console.WriteLine("更新物流信息\n");
        }
    }
}

5、订单上下文类

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

namespace StateModule
{
    /// <summary>
    /// 订单上下文
    /// </summary>
    public class OrderContext
    {
        private IState state;

        public OrderContext()
        {

        }

        public OrderContext(IState state)
        {
            this.state = state;
        }

        // 设置状态 调用状态函数
        public void SetState(IState state)
        {
            this.state = state;
            Console.WriteLine("----订单状态变更----");
            this.state.handle();
        }
    }
}

6、调用与使用

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

namespace StateModule
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建订单
            OrderContext orderContext = new OrderContext();

            // 新建订单 状态
            orderContext.SetState(new NewOrderState());

            // 已经付款 状态
            orderContext.SetState(new PayOrderState());

            // 已经发货 状态
            orderContext.SetState(new SendOrderState());


            Console.ReadLine();

        }
    }
}

在这里插入图片描述

7、优点

1、改变对象状态 可以修改对象的行为
2、减少系统中的对象

8、缺点

1、增加系统的状态类
2、结构与实现较为复杂
3、对开闭原则的支持并不好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值