首页 > 其他分享 >.NET/Js 状态模式

.NET/Js 状态模式

时间:2022-08-24 14:14:06浏览次数:77  
标签:状态 work System 模式 Js State using NET public

概念

描述: 在该模式中,类的行为基于它的状态改变。这种类型的设计模式属于行为型设计模式。

在状态模式中,我们创建表示各种状态的对象和一个随着状态改变而改变的上下文。

  • 意图 : 允许对象在内部状态改变时,改变它的行为,这个对象本身看起来好像修改了它的类。
  • 主要解决 : 对象行为依赖于它的状态,并且可以根据状态改变而改变其行为
  • 何时使用 : 在代码中包含大量对象状态有关的条件语句
  • 解决方案 : 将各种具体的状态抽象出来

JS状态模式

1.新建一个index.js

点击查看代码
/**
 * 状态类
 */
 class State {
	constructor(process) {
	  this.process = process
	}
	/**
	 * 处理状态的方法
	 * @param {*} context 状态上下文
	 */
	handle(context) {
	  //处理具体该流程的业务逻辑
	  console.log(`物品正处于【${this.process}】状态`)
	  //设置下一个状态
	  context.setState(this)
	}
  }
  /**
   * 状态上下文
   */
  class Context {
	/**
	 * 构造函数
	 */
	constructor() {
	  this.state = null
	}
	/**
	 * 获取状态
	 * @returns 返回当前状态
	 */
	getState() {
	  return this.state
	}
	/**
	 * 赋值状态
	 * @param{*} state 状态
	 */
	setState(state) {
	  this.state = state
	  // console.log(`当前上下文的状态为:${state}``);
	}
  }
  

2.调用代码如下:

index.html
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<script src="./StatePattern.js"></script>
	<title>Document</title>
</head>

<body>
	<script>
		var context = new Context();
		var order = new State("ordering");
		var send = new State("sending");
		order.handle(context)
		send.handle(context)
	</script>
</body>

</html>

C# 实现状态模式

1.创建状态机(Work)

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace StatePattern.Console
{
	/// <summary>
	/// 状态机
	/// </summary>
	public class Work
	{
		private State _currentstate;
		private int _processId;
		private bool _finish = false;

		public bool Finish { get => _finish; set => _finish = value; }
		public int ProcessId { get => _processId; set => _processId = value; }

		public Work(State state)
		{
			this._currentstate = state;
			_processId = state.StateId;
		}
		/// <summary>
		/// 设置状态机中的状态
		/// </summary>
		/// <param name="state"></param>
		public void SetState(State state)
		{
			_currentstate = state;
			_processId = state.StateId;
		}
		/// <summary>
		/// 执行节点中的Do方法(代理模式)
		/// </summary>
		/// <param name="func"></param>
		public void Do(Func<int, bool> func)
		{
			_currentstate.Do(this, func);
		}
	}
}

主要目的获取当前状态,存储当前状态id(ProcessId),将当前的状态复制给私有字段,通过当前的状态触发不同的业务逻辑处理

2.创建状态抽象类(State)

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace StatePattern.Console
{
	/// <summary>
	/// 状态
	/// </summary>
	public abstract class State
	{
		public abstract int StateId { get; }
		public abstract void Do(Work work, Func<int, bool> func);

	}
}

这个类的作用是保存当前状态id,Do方法(传委托的意义在于:判断当前属于哪个状态流程,触发不同的业务处理)

3.创建一个下单状态(OrderState)

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

namespace StatePattern.Console
{
	public class OrderState : State
	{
		public override int StateId => 1;

		public override void Do(Work work, Func<int, bool> func)
		{
			//判断状态机是否处于结束状态
			if (!work.Finish)
			{
				// 判断条件是否满足
				if (func(work.ProcessId))
				{
					// ...处理流程需要在该状态处理的逻辑
					System.Console.WriteLine("do order");
					// return work.ProcessId + 1; 
				}
				//设置下一个State
				work.SetState(new SendState());
				//执行下一个State的Do方法
				work.Do(func);
			}
			else
			{
				//否则执行finish
				work.SetState(new FinishState());
				work.Do(func);
			}
		}
	}
}

判断当前传入的状态机是否是完结状态,委托的作用:当前指定的状态id是否与传入的状态id一致,一致则处理对应的业务,不一致则处理下一个状态的业务,下面的处理逻辑基本和上面的一致,就不多介绍了
一个状态处理完毕,处理下一个状态,最后执行完结状态处理方法

4.发送货物的类(SendState)

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

namespace StatePattern.Console
{
	public class SendState : State
	{
		public override int StateId => 2;

		public override void Do(Work work, Func<int, bool> func)
		{
			//判断状态机是否处于结束状态
			if (!work.Finish)
			{
				// 判断条件是否满足
				if (func(work.ProcessId))
				{
					// ...处理流程需要在该状态处理的逻辑
					System.Console.WriteLine("do sending");
				}
				//设置下一个State
				work.SetState(new FinishState());
				//执行下一个State的Do方法
				work.Do(func);
			}
			else
			{
				//否则执行finish
				work.SetState(new FinishState());
				work.Do(func);
			}
		}

	}
}

5.完成状态方法:

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace StatePattern.Console
{
	public class FinishState : State
	{
		public override int StateId => 3;

		public override void Do(Work work, Func<int, bool> func)
		{
			work.Finish = true;
			System.Console.WriteLine("流程结束");

		}
	}
}

标签:状态,work,System,模式,Js,State,using,NET,public
From: https://www.cnblogs.com/rookiewang/p/16618226.html

相关文章

  • .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件
    常用的定时任务组件有Quartz.Net和Hangfire两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的Hangfire,慢慢的发现自己想要的其实只是一个能够根据Cron......
  • 程序的单例模式
    对于一些程序有时需要限制实例个数为单例,如同一时刻,只能有一个实例存在。具体的实现方式主要有互斥锁Mutex和查询进程Process。一、判断是否已创建对应的实例对象1)、通......
  • 简述JS中forEach()、map()、every()、some()和filter()的用法
    在文章开头,先问大家一个问题:在Javascript中,如何处理数组中的每一项数据?有人可能会说,这还不简单,直接一个for循环遍历一下就好了。是的,确实,这是最常见的做法。但是,除......
  • js轮播图(平移版)
    <divclass="container"><ulclass="list"><!--切换逻辑我们当前的动画逻辑是通过修改list元素的left值平移实现的图片切换在图片1的前边没有图片5的......
  • C#/VB.NET 创建PDF/UA文件
    1.什么是PDF/UA文件PDF/UA,即UniversallyAccessiblePDF,该格式的PDF文件是于2012年8月以ISO标准14289-1发布的、具有普遍可访问的PDF文档标准。为带标签的PDF文档(Tagged......
  • c++单例模式
    单例模式的意图:一个类只能有一个实例。 //非线程安全版本1classSingleton{2private:3Singleton();4Singleton(constSingleton&);5public:......
  • 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态
    问题:无法向会话状态服务器发出会话状态请求。请确保ASP.NETStateService(ASP.NET状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检......
  • 基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints
    大家好,我是等天黑。FastEndpoints是一个基于.NET6开发的开源webapi框架,它可以很好地替代.NETMinimalAPIs和MVC,专门为开发效率而生,带来了全新的开发模式和编码......
  • Iterator设计模式
    迭代器设计模式用集合类实现Aggregate接口,并实现其iterator方法,生成特定的迭代器对象,但返回时返回为Iterator类型,以此来抽象编程,实现解耦合的目的。类图:   当使用......
  • js 实现 sum 函数无限累加
    //无限累加sum//一共做两件事://1.调用一次返回当前计算函数本身,该函数主要作用之一为合并多次调用传的不同数量的参数//2.给返回的函数增加valueOf最终计算结......