当前位置: 首页 > news >正文

佛山免费自助建站模板oa手机端

佛山免费自助建站模板,oa手机端,书店网站建设策划书总结,佛山市建设工程交易中心网站参考博客#xff1a; #xff08;1#xff09;FSM#xff08;有限状态机#xff09; #xff08;2#xff09;关于有限状态机(FSM)的一些思考 #xff08;3#xff09;状态设计模式 1 状态机简介 有限状态机FSM#xff1a;有限个状态以及在这些状态之间的转移和动作…参考博客 1FSM有限状态机 2关于有限状态机(FSM)的一些思考 3状态设计模式 1 状态机简介 有限状态机FSM有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 状态机思维将一个事件分成多个完整的状态每个状态通过输入和输出进入下一个状态。 优点可以把模型的多状态和多状态之间的转换条件解耦降低程序耦合度让程序维护变的更加容易 FSM术语state、transition、action、transition condition 2 FSM术语 2.1 状态 State 将一件事拆分为多件事为每一件事赋予一个名字这个名字就被称为FSM中的状态。因其状态有限所以FSM被称为有限状态机。 风扇划分为关、一档、二挡、三挡等状态电梯门划分为关闭、正在开启、开启、正在关闭 2.2 状态转移 状态转移一个状态执行了某些动作转变为另一个状态的过程 2.3 转移条件 Event 在某个状态下达到了某个转移条件才会按照状态机的转移流程转移到下一状态并执行相应的动作 2.4 动作 Action 当转变为一个新状态时在这个状态下需要做的事情称为动作 3 有限状态机的实现方式 实现方式适用场景优点缺点分支逻辑法适用于条件简单状态固定没有新增和扩展的需求状态机代码直译简单直接状态逻辑比较集中容易查看对于较复杂的状态机这种方式容易遗漏或者写错。大量的if-else和switch-case代码分支判断逻辑可读性和可扩展性比较差对新增和修改的场景容易引入bug查表法通过二维数组来表达状态机适用于复杂状态机执行动作比较固定和简单的场景比如游戏这种状态比较多的场景就适合用查表法相对于分支逻辑的实现方式查表法的代码实现更加清晰可读性和可维护性更好遇到比较复杂的动作就无法通过简单的二维数组表示了有一定的局限性状态模式对于状态并不多、状态转移也比较简单但事件触发执行的动作包含的业务逻辑可能比较复杂的状态机来说我们首选这种实现方式代码结构更清晰可以规避过多的分支逻辑判断代码可维护性更高状态模式会引入很多状态类如果状态颗粒度控制不好会导致状态类爆炸问题另外逻辑比较分散集中在状态类中无法在一个地方整体看出整个状态机的逻辑 3.1 示例FSM 三种状态未支付、未收货、完成 两种事件支付、收货 状态的流转即动作支付后状态为未收货收货后状态为完成 支付状态枚举 // 支付状态枚举 enum PayState {// 待支付UNPAY 0,// 待收货UNRECEIVE 1,// 完成FINAL 2,// 错误ERROR 3, };支付事件枚举 // 支付事件枚举 enum PayEvent {// 支付Pay 0,// 收货RECEIVE 1, };3.2 分支逻辑法 #include iostreamusing namespace std;// 支付状态枚举 enum PayState {// 待支付UNPAY 0,// 待收货UNRECEIVE 1,// 完成FINAL 2,// 错误ERROR 3, };// 支付事件枚举 enum PayEvent {// 支付PAY 0,// 收货RECEIVE 1, };class PayStateMachine {private:PayState payState;public:PayStateMachine() {payState PayState::UNPAY;}void executeEvent(PayEvent payEvent) {switch (payEvent) {// 支付行为发生未支付 - 待收货case PAY:if (this-payState ! PayState::UNPAY) {cout 商铺不是【未支付】状态请核验 endl;this-payState PayState::ERROR;break;} this-payState PayState::UNRECEIVE;break;// 收货行为发生待收货 - 完成case RECEIVE:if (this-payState ! PayState::UNRECEIVE) {cout 商铺不是【未收货】状态请核验 endl;this-payState PayState::ERROR;break;}this-payState PayState::FINAL;break;default:cout 未设置的行为 endl;break;}}PayState getCurrentState() {return this-payState;} };int main() {PayStateMachine payStateMachine;cout 当前状态为 payStateMachine.getCurrentState() endl;payStateMachine.executeEvent(PayEvent::RECEIVE);cout 当前状态为 payStateMachine.getCurrentState() endl;return 0; }运行结果 当前状态为0 商铺不是【未收货】状态请核验 当前状态为33.3 查表法 将状态和事件形成一个二维矩阵表将结果态放入其中 UNPAYUNRECEIVEFINALPAY状态转为UNRECEIVEERRORERRORRECEIVEERROR状态转为FINALERROR 将结果态转为一个二维数组进行存储用的时候使用状态和事件枚举的value值作为索引获取结果态 #include iostream #include vector using namespace std;// 支付状态枚举 enum PayState {// 待支付UNPAY 0,// 待收货UNRECEIVE 1,// 完成FINAL 2,// 错误ERROR 3, };// 支付事件枚举 enum PayEvent {// 支付PAY 0,// 收货RECEIVE 1, };class PayStateMachine {public:// 初始化PayStateMachine() {currentPayState PayState::UNPAY;}// 使用状态和事件枚举的value值作为索引获取结果态void executeEvent(PayEvent payEvent) {this-currentPayState payStateTable[this-currentPayState][payEvent];}// 获取当前状态PayState getCurrentState() {return this-currentPayState; }private:// 当前状态PayState currentPayState;// 将结果态转为一个二维数组进行存储vectorvectorPayState payStateTable {{UNRECEIVE, ERROR, ERROR},{ERROR, FINAL, ERROR}}; };int main() {PayStateMachine payStateMachine;cout 当前状态为 payStateMachine.getCurrentState() endl;payStateMachine.executeEvent(PayEvent::PAY);cout 当前状态为 payStateMachine.getCurrentState() endl;payStateMachine.executeEvent(PayEvent::RECEIVE);cout 当前状态为 payStateMachine.getCurrentState() endl;return 0; }运行结果 当前状态为0 当前状态为1 当前状态为23.4 状态模式 状态模式定义状态接口并将行为规定为抽象方法实现对应三种状态以及行为方法实现状态流转逻辑。 定义状态机并依赖状态接口。 同时每个具体的状态又依赖状态机。 即状态机和各个状态类之间是双向依赖关系因为每个状态需要依靠状态机修改状态 状态模式将每个状态的实现都封装在一个类中每个状态类的实现相对独立使得添加新状态或修改现有状态变得更加容易避免了使用大量的条件语句来控制对象的行为。但是如果状态过多会导致类的数量增加可能会使得代码结构复杂。 状态模式基本结构 State定义一个接口用于封装与Context的一个特定状态相关的行为ConcreteState具体状态 负责处理Context在状态改变时的行为, 每一个具体状态子类实现一个与Context的一个状态相关的行为。Context上下文: 维护一个具体状态子类的实例这个实例定义当前的状态 #include iostream #include vector #include string// 状态接口 class State { public:virtual std::string handle() 0; // 处理状态的方法 };// 具体状态类 class OnState : public State { public:std::string handle() override {return Light is ON;} };class OffState : public State { public:std::string handle() override {return Light is OFF;} };class BlinkState : public State { public:std::string handle() override {return Light is Blinking;} }; // 上下文类 class Light { private:State* state; // 当前状态 public:Light() : state(new OffState()) {} // 初始状态为关闭void setState(State* newState) { // 设置新的状态delete state; // 释放之前的状态对象state newState;}std::string performOperation() { // 执行当前状态的操作return state-handle();}~Light() {delete state; // 释放内存} };int main() {// 读取要输入的命令数量int n;std::cin n;std::cin.ignore(); // 消耗掉整数后的换行符// 创建一个Light对象Light light;// 处理用户输入的每个命令for (int i 0; i n; i) {// 读取命令并去掉首尾空白字符std::string command;std::getline(std::cin, command);// 根据命令执行相应的操作if (command ON) {light.setState(new OnState());} else if (command OFF) {light.setState(new OffState());} else if (command BLINK) {light.setState(new BlinkState());} else {// 处理无效命令std::cout Invalid command: command std::endl;}// 在每个命令后显示灯的当前状态std::cout light.performOperation() std::endl;}return 0; }4 Autoware有限状态机代码解析 state_machine.h #ifndef STATE_MACHINE_H #define STATE_MACHINE_H#include memory #include iostreamnamespace state_machine { // 定义一个枚举类StateList表示车辆的不同状态 enum class StateList : int32_t {MOVE_FORWARD, // 车辆向前移动TRAFFIC_LIGHT_STOP, // 遇到红灯停车LANE_CHANGE, // 车辆变更车道STOP_SIGN_STOP, // 遇到停车标志停车OBSTACLE_AVOIDANCE, // 避障MISSION_COMPLETE 100, // 任务完成EMERGENCY -1, // 紧急情况 }; // 定义一个枚举类TrafficLight表示交通信号灯的状态 enum class TrafficLight : int32_t {RED, // 红灯GREEN, // 绿灯UNKNOWN, // 未知 }; // 定义一个枚举类ChangeFlag表示车辆变更车道的方向 enum class ChangeFlag : int32_t {straight, // 直行right, // 向右变更车道left, // 向左变更车道unknown -1, // 未知方向 }; // 用于将枚举类类型转换为整数类型 // 可以将枚举类的实例转换为整数类型便于进行数值计算或其他整数相关的操作 template class T typename std::underlying_typeT::type enumToInteger(T t) {return static_casttypename std::underlying_typeT::type(t); }// Forward Decralation class StateContext;// abstract class for states class BaseState { public:virtual ~BaseState() default; // 确保子类可以正确地删除基类对象virtual void update(StateContext *context) 0; // 用于更新状态virtual int32_t getStateName() // 返回当前状态的名称{return 0;};virtual std::unique_ptrstd::string getStateNameString() // 返回当前状态的名称字符串{return 0;}; };// State : MOVE_FORWARD class StateMoveForward : public BaseState { public:// 更新状态逻辑void update(StateContext *context) override;// 获取状态名称整数表示int32_t getStateName() override{return enumToInteger(StateList::MOVE_FORWARD);}// 获取状态名称字符串表示std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(MOVE_FORWARD));}// 静态方法用于创建 StateMoveForward 对象static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateMoveForward);};private:StateMoveForward() default; };// State : TRAFFIC_LIGHT_STOP class StateTrafficLightStop : public BaseState { public:// 更新状态逻辑void update(StateContext *context) override;// 获取状态名称整数表示int32_t getStateName() override{return enumToInteger(StateList::TRAFFIC_LIGHT_STOP);}// 获取状态名称字符串表示std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(TRAFFIC_LIGHT_STOP));}// 静态方法用于创建 StateTrafficLightStop 对象static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateTrafficLightStop);};private:StateTrafficLightStop() default; };// State : LANE_CHANGE class StateLaneChange : public BaseState { public:// 更新状态逻辑void update(StateContext *context) override;// 获取状态名称整数表示int32_t getStateName() override{return enumToInteger(StateList::LANE_CHANGE);}// 获取状态名称字符串表示std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(LANE_CHANGE));}// 静态方法用于创建 StateLaneChange 对象static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateLaneChange);};private:StateLaneChange() default; };// State : STOP_SIGN_STOP class StateStopSignStop : public BaseState {public:// 更新状态逻辑void update(StateContext *context) override;// 获取状态名称整数表示int32_t getStateName() override{return enumToInteger(StateList::STOP_SIGN_STOP);}// 获取状态名称字符串表示std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(STOP_SIGN_STOP));}// 静态方法用于创建StateStopSignStop对象static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateStopSignStop);};private:StateStopSignStop() default; };// State : Obstacle Avoidance class StateObstacleAvoidance : public BaseState {public:void update(StateContext *context) override;int32_t getStateName() override{return enumToInteger(StateList::STOP_SIGN_STOP);}std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(OBSTACLE_AVOIDANCE));}static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateObstacleAvoidance);};private:StateObstacleAvoidance() default; };// State : EMERGENCY class StateEmergency : public BaseState { public:void update(StateContext *context) override;int32_t getStateName() override{return enumToInteger(StateList::EMERGENCY);}std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(EMERGENCY));}static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateEmergency);};private:StateEmergency() default; };// State : MISSION_COMPLETE class StateMissionComplete : public BaseState { public:void update(StateContext *context) override;int32_t getStateName() override{return enumToInteger(StateList::MISSION_COMPLETE);}std::unique_ptrstd::string getStateNameString() override{return std::unique_ptrstd::string(new std::string(MISSION_COMPLETE));}static std::unique_ptrBaseState create(){return std::unique_ptrBaseState(new StateMissionComplete);};private:StateMissionComplete() default; }; // 包含状态机当前状态的上下文对象它包含了当前状态、交通灯颜色和车辆变更车道等信息 class StateContext { public:StateContext(): state_(StateMoveForward::create()), light_color_(TrafficLight::UNKNOWN), change_flag_(ChangeFlag::unknown){};// 设置状态机当前状态void setState(std::unique_ptrBaseState newState){state_ std::move(newState);};// 更新状态机状态void update(){state_-update(this);}// 设置交通灯颜色void setLightColor(const int32_t msg){light_color_ static_castTrafficLight(msg);}// 设置变道方向void setChangeFlag(const int32_t msg){change_flag_ static_castChangeFlag(msg);}// 获取当前交通灯颜色TrafficLight getLightColor() const{return light_color_;}// 获取当前变道方向ChangeFlag getChangeFlag() const{return change_flag_;}// 获取当前状态机的整数表示状态名称int32_t getCurrentState() const{return state_-getStateName();}// 获取当前状态机的字符串表示状态名称std::unique_ptrstd::string getCurrentStateString() const{return state_-getStateNameString();}private:std::unique_ptrBaseState state_;TrafficLight light_color_;ChangeFlag change_flag_; };} // state_machine #endif // STATE_MACHINE_Hstate_machine.cpp #include state_machine.hnamespace state_machine { void StateTrafficLightStop::update(StateContext *context) {// 如果交通灯颜色为绿色表示可以继续行驶将状态机转移到StateMoveForward状态if (context-getLightColor() TrafficLight::GREEN)context-setState(StateMoveForward::create()); }void StateMoveForward::update(StateContext *context) {// 如果交通灯颜色为红色表示需要停车将状态机转移到 StateTrafficLightStop 状态if (context-getLightColor() TrafficLight::RED)context-setState(StateTrafficLightStop::create());// 如果变化标志为右转或左转将状态机转移到 StateLaneChange 状态if(context-getChangeFlag() ChangeFlag::right || context-getChangeFlag() ChangeFlag::left)context-setState(StateLaneChange::create()); }void StateLaneChange::update(StateContext *context) {// 如果变化标志为直行将状态机转移到 StateMoveForward 状态if(context-getChangeFlag() ChangeFlag::straight)context-setState(StateMoveForward::create()); }void StateStopSignStop::update(StateContext *context) {// stop sign stop }void StateMissionComplete::update(StateContext *context) {// Mission complete }void StateEmergency::update(StateContext *context) {// Emergency }void StateObstacleAvoidance::update(StateContext *context) {// Obstacle Avoidance }} // state_machine有限状态机原理及三种模式代码实现如上错误之处望读者指正。
http://www.pierceye.com/news/172491/

相关文章:

  • 如何做黑客攻击网站专业的网站建设运营
  • 门户网站建站流程做网站在哪里做比较好
  • 青创网站首页wordpress用户发文章
  • wordpress 仿站 主题网站建设拍金手指排名贰拾
  • 自己的网站怎么做跳转广州白云建方舱医院
  • 免费搭建购物网站网页游戏网站打不开
  • 专业的东莞网站设计wordpress extra script
  • 嘉兴网站开发公司电话从零开始创建wordpress主题.pdf
  • 备案号怎么添加到网站自己做网站原始代码
  • 可以做exe的网站邯郸做紧固件网站
  • 电子商务网站开发的说法移动端首页尺寸
  • 普通网站服务器房地产营销门户网站开发
  • 免费做公司网站wordpress文章格式
  • 制作网站教学设计金湖县城乡建设局网站
  • 微商城网站建设咨询网站做的不满意
  • 装企工长网站开发互联网营销师考试内容
  • 广州高端网站定制公司哪家好全椒县城乡规划建设局网站
  • 物流网站毕业设计论文论坛网站模板下载
  • 代理上网蜗牛精灵seo
  • 网站怎么做用qq登录接入网络舆情监测分析系统
  • 怎么把几个网站做互通wordpress 英文站
  • 建设高端网站需要多少钱wordpress检测
  • 如何学习网站建设app嘉兴建站软件
  • 驻马店市建设工程网站平面设计培训班学费一般多少百度贴吧
  • 长沙网络建设的网站免费的个人简历模板word下载
  • 网站维护简单吗wordpress绿色两栏响应式主题
  • 二手站网站怎做福州网站建设的公司哪家好
  • dw如何做网站后台佛山行业网站建设
  • 如何做网站轮播大图简单网页制作成品代码
  • 网站怎么做uc整合查企业网站