StatePattern-状态模式

ZHIZRL / 2023-08-23 / 原文

C#中的状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。状态模式的核心思想是将对象的行为封装在不同的状态类中,对象根据当前状态的不同而执行不同的行为。

在C#中,实现状态模式通常需要以下几个参与者:

状态接口(State Interface):定义了表示不同状态的方法或属性。通常会定义一组与状态相关的行为。

具体状态类(Concrete State):实现了状态接口,并且提供了状态的具体逻辑。每个具体状态类都表示了对象在特定状态下的行为。

环境类(Context):包含一个具体状态对象,并在运行时通过状态对象来执行不同的行为。环境类通常会将与状态相关的操作委托给当前状态对象来处理。

下面是一个简单的示例代码,演示了如何使用状态模式来实现一个电梯控制系统:

namespace StatePattern_状态模式
{
    internal class Program
    {
        // 状态接口
        public interface IState
        {
            void Open();
            void Close();
            void Run();
            void Stop();
        }

        // 具体状态类
        public class OpenState : IState
        {
            public void Open()
            {
                Console.WriteLine("电梯门已打开,无需再次打开。");
            }

            public void Close()
            {
                Console.WriteLine("电梯门关闭。");
            }

            public void Run()
            {
                Console.WriteLine("电梯开始运行。");
            }

            public void Stop()
            {
                Console.WriteLine("电梯停止运行。");
            }
        }

        public class CloseState : IState
        {
            public void Open()
            {
                Console.WriteLine("电梯门打开。");
            }

            public void Close()
            {
                Console.WriteLine("电梯门已关闭,无需再次关闭。");
            }

            public void Run()
            {
                Console.WriteLine("电梯开始运行。");
            }

            public void Stop()
            {
                Console.WriteLine("电梯停止运行。");
            }
        }

        // 环境类
        public class Context
        {
            private IState currentState;

            public Context()
            {
                // 初始化为关闭状态
                currentState = new CloseState();
            }

            public void SetState(IState state)
            {
                currentState = state;
            }

            public void Open()
            {
                currentState.Open();
                SetState(new OpenState());
            }

            public void Close()
            {
                currentState.Close();
                SetState(new CloseState());
            }

            public void Run()
            {
                currentState.Run();
            }

            public void Stop()
            {
                currentState.Stop();
            }
        }
        static void Main(string[] args)
        {
            // 创建电梯控制系统
            var context = new Context();

            // 执行一系列操作
            context.Open();   // 打开电梯门
            context.Run();    // 电梯开始运行
            context.Stop();   // 电梯停止运行
            context.Close();  // 关闭电梯门
            Console.Read();
            //输出结果
            //电梯门打开。
            //电梯开始运行。
            //电梯停止运行。
            //电梯门关闭。
        }
    }
}

 上述示例中,状态接口 IState 定义了电梯可能的各个状态,并提供了相应的操作方法。具体状态类 OpenState 和 CloseState 分别实现了具体的状态逻辑。环境类 Context 包含一个当前状态对象,并根据不同状态执行相应的操作。

通过使用状态模式,我们可以实现对象状态和行为的解耦,使得代码更加灵活和可扩展。同时,状态模式也使得状态切换更加容易,并且各个状态的逻辑可以独立变化而不影响其他状态的实现。