有限状态机FSM

有限状态机FSM

一、什么是有限状态机

有限状态机简写为FSM(Finite State Machine),它有4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。

二、Flutter中的Bloc

触发事件 ---> bloc派发event ---> bloc中map根据不同的event执行不同逻辑 ---> 生成新的状态state ---> 页面根据新的状态重新渲染

三、Redux

四、iOS中实现一个FSM( TransitionKit)

三方库:TransitionKit
1.State

每个状态有四个闭包,可以在创建State的时候传入action

2.Event

每个Event代表从某个状态(sourceStates)变化到另一个状态(destinationState)

3.Transition

用来运输State变化过程中的各个对象,包括:

4.Machine

FSM控制中心

5.例子
 	// 1.核心machine
    TKStateMachine *machine = [[TKStateMachine alloc] init];
    
    // 2.定义未读状态
    TKState *unread = [TKState stateWithName:@"unread"];
    
    [unread setWillExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"unread WillExit: %@", userInfo);
    }];
    
    [unread setWillEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"unread WillEnter: %@", userInfo);
    }];
    
    [unread setDidExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"unread DidExit: %@", userInfo);
    }];
    
    [unread setDidEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"unread DidEnter: %@", userInfo);
    }];
    
    // 3.定义已读状态
    TKState *read = [TKState stateWithName:@"read"];
    
    [read setWillExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"read WillExit: %@", userInfo);
    }];
    
    [read setWillEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"read WillEnter: %@", userInfo);
    }];
    
    [read setDidExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"read DidExit: %@", userInfo);
    }];
    
    [read setDidEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"read DidEnter: %@", userInfo);
    }];
    
    // 4.定义删除状态
    TKState *delete = [TKState stateWithName:@"delete"];
    
    [delete setWillExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"delete WillExit: %@", userInfo);
    }];
    
    [delete setWillEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"delete WillEnter: %@", userInfo);
    }];
    
    [delete setDidExitStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"delete DidExit: %@", userInfo);
    }];
    
    [delete setDidEnterStateBlock:^(TKState *state, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"delete DidEnter: %@", userInfo);
    }];
    
    TKEvent *readEvent = [TKEvent eventWithName:@"read" transitioningFromStates:@[unread] toState:read];
    
    [readEvent setWillFireEventBlock:^(TKEvent *event, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"readEvent WillFire: %@", userInfo);
    }];
    
    [readEvent setDidFireEventBlock:^(TKEvent *event, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"readEvent DidFire: %@", userInfo);
    }];
    
    TKEvent *deleteEvent = [TKEvent eventWithName:@"delete" transitioningFromStates:@[read, unread] toState:delete];
    
    [deleteEvent setWillFireEventBlock:^(TKEvent *event, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"deleteEvent WillFire: %@", userInfo);
    }];
    
    [deleteEvent setDidFireEventBlock:^(TKEvent *event, TKTransition *transition) {
        NSString *userInfo = transition.userInfo[@"key"];
        NSLog(@"deleteEvent DidFire: %@", userInfo);
    }];
    
    // 5.配置并启动machine
    
    NSLog(@"🔥1.初始化machine");
    
    [machine addStates:@[read, unread, delete]];
    [machine addEvents:@[readEvent, deleteEvent]];
    [machine setInitialState:unread];
    [machine activate];
    
    // 6.触发event
    
    NSError *error = nil;
    
    NSLog(@"-------->1.当前状态---> %@", [machine currentState]);
    
		// 触发从unread到read的event
    [machine fireEvent:readEvent userInfo:@{@"key": @"unread to read"} error:&error];
    
    NSLog(@"-------->2.当前状态---> %@", [machine currentState]);
    
		// 触发从unread/delete
    [machine fireEvent:deleteEvent userInfo:@{@"key": @"unread/read to delete"} error:&error];
    
    NSLog(@"-------->3.当前状态---> %@", [machine currentState]);

参考: