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

网站建设工公司被其它人拿来做网站

网站建设工,公司被其它人拿来做网站,wordpress备份网站,友点企业网站管理系统模板状态机有3个要素:状态,事件,动作。 假如一个对象有3个状态:S1、S2、S3。影响状态的事件有3个:E1、E2、E3。每个状态下收到对应事件的时候,对象的动作为AXY。那么该对象的状态机就可以用如下表格来表示。S1收到事件E1的…

状态机有3个要素:状态,事件,动作。

假如一个对象有3个状态:S1、S2、S3。影响状态的事件有3个:E1、E2、E3。每个状态下收到对应事件的时候,对象的动作为AXY。那么该对象的状态机就可以用如下表格来表示。S1收到事件E1的时候动作为A11,收到事件E2的时候动作为A12,收到事件E3的时候动作为A13,以此类推。

E1E2E3
S1A11A12A13
S2A21A22A23
S3A31A32A33

其中,动作可以是状态发生切换,也可以是其它与业务有关的动作。

1分支逻辑法

分支逻辑法,是最简单 、最直观,也是最常用的一种方法。

如下是分支逻辑法的实现:

if(state == S1) {

    if (event == E1) {

        A31();

    } else if (event == E2) {

       A32();

    } else {

        A33();

    }

} else if (state == S2) {

    if (event == E1) {

        A31();

    } else if (event == E2) {

       A32();

    } else {

        A33();

    }

} else {

    if (event == E1) {

        A31();

    } else if (event == E2) {

       A32();

    } else {

        A33();

    }

}

在linux内核中,tcp有自己的状态机,如下代码,就是在收到tcp报文时,其中的一小段状态机代码,这段代码就是使用分支逻辑法。

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)

{

    ...

    switch (sk->sk_state) {

    case TCP_CLOSE:

        goto discard;

    case TCP_LISTEN:

        if (th->ack)

            return 1;

        if (th->rst)

            goto discard;

        if (th->syn) {

            if (th->fin)

                goto discard;

            /* It is possible that we process SYN packets from backlog,

             * so we need to make sure to disable BH and RCU right there.

             */

            rcu_read_lock();

            local_bh_disable();

            acceptable = icsk->icsk_af_ops->conn_request(sk, skb) >= 0;

            local_bh_enable();

            rcu_read_unlock();

            if (!acceptable)

                return 1;

            consume_skb(skb);

            return 0;

        }

        goto discard;

    case TCP_SYN_SENT:

        tp->rx_opt.saw_tstamp = 0;

        tcp_mstamp_refresh(tp);

        queued = tcp_rcv_synsent_state_process(sk, skb, th);

        if (queued >= 0)

            return queued;

        /* Do step6 onward by hand. */

        tcp_urg(sk, skb, th);

        __kfree_skb(skb);

        tcp_data_snd_check(sk);

        return 0;

    }

    ...

}

2查表法

如果状态发生改变,比如增删,或者事件发生改变,比如增加一个事件或者删除一个事件,就需要对代码进行修改。分支逻辑法不满足开闭原则。

查表法使用两个两级map:

①transitionTable

第一级map的key为状态,value是第二级map;第二级map的key是事件类型,value是目标状态。

②actionTable
第一级map的key为状态类型,value是第二级map;第二级map的key是事件类型,value是action。

如下是查表法的示意代码:

#include <iostream>
#include <map>
#include <functional>
#include <stdexcept> // 用于异常处理enum class State : int32_t {S1,S2,S3
};enum class Event : int32_t {E1,E2,E3
};class StateMachine {
public:StateMachine(State const& initialState) : state_{initialState} {// 初始化状态转移表transitionTable_ = {{State::S1, {{Event::E1, State::S1}, {Event::E2, State::S2}, {Event::E3, State::S3}}},{State::S2, {{Event::E1, State::S1}, {Event::E2, State::S3}, {Event::E3, State::S2}}},{State::S3, {{Event::E1, State::S3}, {Event::E2, State::S2}, {Event::E3, State::S3}}}};// 初始化动作表(修复 lambda 捕获和逗号分隔)actionTable_ = {{State::S1, {{Event::E1, [this]() { std::cout << "action11\n"; }},{Event::E2, [this]() { std::cout << "action12\n"; }},{Event::E3, [this]() { std::cout << "action13\n"; }}}},{State::S2, {{Event::E1, [this]() { std::cout << "action21\n"; }},{Event::E2, [this]() { std::cout << "action22\n"; }},{Event::E3, [this]() { std::cout << "action23\n"; }}}},{State::S3, {{Event::E1, [this]() { std::cout << "action31\n"; }},{Event::E2, [this]() { std::cout << "action32\n"; }},{Event::E3, [this]() { std::cout << "action33\n"; }}}}};}void OnEvent(Event const& event) {// 检查当前状态和事件是否有效if (actionTable_.find(state_) == actionTable_.end() ||actionTable_[state_].find(event) == actionTable_[state_].end()) {throw std::runtime_error("Invalid state or event!");}// 执行动作并更新状态actionTable_[state_][event](); // 调用函数state_ = transitionTable_[state_][event];}State GetState() {return state_;}private:State state_;std::map<State, std::map<Event, State>> transitionTable_;std::map<State, std::map<Event, std::function<void()>>> actionTable_;
};int main() {StateMachine sm{State::S1};sm.OnEvent(Event::E3); // 修复拼写错误if (State::S3 != sm.GetState()) {std::cout << "state " << (int32_t)sm.GetState() << " is not expected\n";}sm.OnEvent(Event::E2);if (State::S2 != sm.GetState()) {std::cout << "state " << (int32_t)sm.GetState() << " is not expected\n";}return 0;
}

查表法相对于分支逻辑法 ,将状态机创建的代码和状态机转换的代码进行了解耦。如果状态有改变或者事件有改变,那么可以修改StateMachine的构造函数,而不需要修改OnEvent函数。

transitionTable_和actionTable_是数据结构,可以看作存储,OnEvent中的代码逻辑可以看作计算逻辑。解耦就是将存储和计算逻辑代码进行分离,将可以修改的部分和不可以修改的部分进行分离。


文章转载自:

http://0dQOHXrs.kyhnL.cn
http://1P0OqLiu.kyhnL.cn
http://dXN6eQ77.kyhnL.cn
http://El07ncTo.kyhnL.cn
http://tmoSqiJk.kyhnL.cn
http://YVwhfNqA.kyhnL.cn
http://YReYJjRg.kyhnL.cn
http://w6bsFBZf.kyhnL.cn
http://9YVs0Uky.kyhnL.cn
http://4bMnpKZW.kyhnL.cn
http://PduKO5sb.kyhnL.cn
http://LuME8Xgz.kyhnL.cn
http://QzAELQP9.kyhnL.cn
http://AbUk74R1.kyhnL.cn
http://ItjGJ3y5.kyhnL.cn
http://iJ1au27V.kyhnL.cn
http://LA4wAUiH.kyhnL.cn
http://mur48JhQ.kyhnL.cn
http://RdDFifZN.kyhnL.cn
http://WloWRA3C.kyhnL.cn
http://kjdFAq5G.kyhnL.cn
http://bEoL4cNQ.kyhnL.cn
http://asuNuqeq.kyhnL.cn
http://KcVr2JKI.kyhnL.cn
http://CQxmcQyu.kyhnL.cn
http://UUuCQtKR.kyhnL.cn
http://6SvZ1Dz4.kyhnL.cn
http://nmotQicT.kyhnL.cn
http://WzZJoJBQ.kyhnL.cn
http://544i11YY.kyhnL.cn
http://www.dtcms.com/wzjs/778550.html

相关文章:

  • 广安做网站Wordpress首页制作代码
  • wordpress做导航网站福州网站制作培训
  • 淮南网站seo网站建设目的和意义
  • 广州高铁新建站在哪里在线视频直播网站建设
  • 网站重新备案贵州网站建设维护
  • 花都区pc端网站建设平面设计教程网站有哪些
  • 网站做接口到app价格手机网站建设软件有哪些内容
  • 江苏南京建设工程信息网站wordpress如何关闭网页
  • 手机wap网站模板免费下载南昌做网站哪家公司比较好
  • 一个专做窗帘的网站wordpress模板影视
  • 网站建设背景介绍vue cms 网站开发
  • .org做商业网站WordPress排除某个分类
  • 怎样做推广网站免费域名申请 知乎
  • 沈阳市于洪区建设局网站asp网站实现php栏目
  • 河南省建设工程信息网查询洛阳霞光seo网络公司
  • 网站开发界面设计工具深圳市网络营销推广平台
  • 网站建设账务处理属于什么费用广东省东莞阳光网
  • 网站美工如何做重庆seowhy整站优化
  • 专业建站公司费用周村区住房和城乡建设厅网站
  • 网站建设费怎么入账谷歌ads
  • 自己网站上做淘宝搜索引擎网站建设互联
  • 青海做网站公司天元建设集团有限公司 伊永成 电话
  • 深圳企业年报wordpress 如何优化
  • 建设银行分期手机网站黄crm在线
  • 衡水网站建费用网站模板图
  • 我国婚纱网站建设的现状自建app
  • 网站后期维护协议网站301的作用
  • 方维o2o 2.9蓝色团购网站程序源码模板软件开发培训课程咨询
  • 如何做公司的网站品牌网图片新闻2003年下一条文章
  • 建站教程pdf网站建设全视频教程下载