首页 > 其他分享 >StatePattern-状态模式

StatePattern-状态模式

时间:2023-08-23 20:00:22浏览次数:41  
标签:状态 Console void 模式 StatePattern 电梯 电梯门 public

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 包含一个当前状态对象,并根据不同状态执行相应的操作。

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

标签:状态,Console,void,模式,StatePattern,电梯,电梯门,public
From: https://www.cnblogs.com/ZHIZRL/p/17652647.html

相关文章

  • springboot之RedisTemplate的访问单机,哨兵,集群模式
    springboot2默认已经使用了lettuce-core,没有使用jedis和Redisson,springboot1使用的是jedis。我使用的springboot版本是2.6.14。(对应的lettuce版本为6.1.10.RELEASE,对应jedis版本为3.7.1)<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactI......
  • 前端发布订阅模式
    前端发布订阅是一种用于实现应用程序内各个组件之间通信的技术,它可以让组件之间解耦,提高应用程序的灵活性和可维护性。本文将结合代码介绍前端发布订阅的概念、作用、应用场景以及如何设置和管理它们。一、概念和作用前端发布订阅是一种消息传递模式,它允许组件之间通过发布和订阅......
  • Java代理模式初探
    代理模式是一种常见的软件设计模式。所谓的代理者是指一个类别可以作为其它对象的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它重要或无法复制的资源。有时候我们需要需要一个功能(通常是一个API)。该功能已经被某个类A实现了,代理类B实现相同的接口,并将......
  • 线程状态
    1)新建当用new关键字创建一个线程时,还没调用start就是新建状态。2)就绪调用了start方法之后,线程就进入了就绪阶段。此时,线程不会立即执行run方法,需要等待获取CPU资源。start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间3)运行当线程获得CPU时间片后,就会进入......
  • 混合开发模式是否可以在App备案制度下突围
    网站ICP备案已施行了很久,我们也非常清楚必须在进行ICP备案后,网站才能在大陆范围合法运营,并且用户可以通过域名正常访问网站。但是月初出了新规,明年起,国内的App也要像网站一样进行备案了。想必大家也是早已经听到过这个刷屏的新闻,随便说一声小程序也是。在管理日益强化的......
  • 多轨模式——保存导出混缩
    贴在一起的时候,会自动匹配到如果想把多轨变成三轨,就可以这样子做......
  • 自动请求钩子,返回loding状态
    //useAutoRequest.ts/**@Date:2023-02-1009:55:20*@Description:useAutoRequest*/import{Ref,ref}from'vue';typeTApiFun<TData,TParamsextendsArray<any>>=(...params:TParams)=>Promise<TData>;interface......
  • Vue 重置data的数据为初始状态操作
    在某些情况下,需要重新使用data中的数据,但是data中的数据已经被各种表单、变量等赋值,那么怎么重置data的值呢?1.逐个赋值...data(){return{name:'',sex:'',desc:''}}...//逐个赋值this.name=''this.sex=''this.desc=''这个方法比较笨,当然也......
  • SAP ABAP 模式(Pattern)、模板的创建与调用
    1.代码模板2.模式(Pattern) 调用3.标准模式,一些内置固定格式代码的填充  ......
  • 多轨模式——音量与立体音包络线
    这个是主控,可以控制上面所有的音频轨道可以改左右声音大小立体声平衡,调整左右边音量如何来打关键帧,直接打这根线就好了上面的线是音量,下面的线是左右觉得过渡太生硬了,选择关键帧,曲线。这个是静音当前轨道这个是soloR是录音,注意录音的时候要把别的删掉......