带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)

简介: 带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
+关注继续查看

带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)https://developer.aliyun.com/article/1338239?groupCode=taobaotech

状态的信息 StateInfo

 

包含的功能和特点:

  1. 当前上下文仅有一种状态信息流转
  2. 业务方可以保存多个状态键值对,状态根据需要执行相应的代码逻辑。

 状态信息的声明和实现代码示例如下

@interface TBBaseStateInfo : NSObject { @private
TBBaseState<TBBaseStateDelegate> *_currentState; //记录当前的 State
}
//使用当前的 State 执行
-   (void)performAction;
//更新当前的 State
-   (void)setState:(TBBaseState <TBBaseStateDelegate> *)state;
//获取当前的 State
-   (TBBaseState<TBBaseStateDelegate> *)getState; 
@end

@implementation TBBaseStateInfo
- (void)performAction {
//当前状态开始执行
[_currentState perfromAction:self];
}
-   (void)setState:(TBBaseState <TBBaseStateDelegate> *)state {
_currentState = state;
}
-   (TBBaseState<TBBaseStateDelegate> *)getState { return _currentState;
}
@end


 

上层业务代码示例如下

 

    typedef NS_ENUM(NSInteger, TBStateType) {
    TBStateTypeNormal, //空状态
3TBStateTypeSingleCode, //单码展示态
    TBStateTypeMultiCode, //多码展示态
 };
 
@interface TBStateInfo : TBBaseStateInfo
//以 key-value 的方式存储业务 type 和对应的状态 state
-   (void)setState:(TBBaseState<TBBaseStateDelegate> *)state forType:(TBStateType)type;
//更新 type,并执行 state
-   (void)setType:(TBStateType)type; @end

@implementation TBStateInfo

-   (void)setState:(TBBaseState<TBBaseStateDelegate> *)state forType:(TBStateType)type { [self.stateDict tb_setObject:state forKey:@(type)];
}

-   (void)setType:(TBStateType)type { id oldState = [self getState];
//找到当前能响应的状态
id newState = [self.stateDict objectForKey:@(type)];
//如果状态未发生变更则忽略if (oldState == newState)
return;
if ([newState respondsToSelector:@selector(perfromAction:)]) { [self setState:newState];
//转态基于当前的状态信息开始执行[newState perfromAction:self];
}
}
@end

 

状态的基类 BaseState

 

包含的功能和特点:

  1. 定义了状态的基类
  2. 声明了状态的基类需要遵循的 Protocol

 

Protocol 如下,基类为空实现,子类继承后,实现对 StateInfo 的处理。

1   @protocol TBBaseStateDelegate <NSObject>
2   - (void)perfromAction:(TBBaseStateInfo *)stateInfo;
3   @end

 


上层(以单码 State 为例)代码示例如下

 

@interface TBSingleCodeState : TBBaseState
@end

@implementation TBSingleCodeState

//实现 Protocol
- (void)perfromAction:(TBStateInfo *)stateAction {
//业务逻辑处理 Start
...
//业务逻辑处理 End
}

@end

业务层调用

 


以下代码生成一系列状态,在合适时候进行状态的切换。


//状态初始化
- (void)setupState {
TBSingleCodeState *singleCodeState = TBSingleCodeState.new; //单码状态TBNormalState *normalState = TBNormalState.new; //正常状态TBMultiCodeState *multiCodeState = [self getMultiCodeState]; //多码状态
[self.stateInfo setState:normalState forType:TBStateTypeNormal]; [self.stateInfo setState:singleCodeState forType:TBStateTypeSingleCode];
[self.stateInfo setState:multiCodeState forType:TBStateTypeMultiCode];
)
//切换常规状态
- (void)processorA {
//...
[self.stateInfo setType:TBStateTypeNormal];
//...
}

//切换多码状态
- (void)processorB {
//...

22

 

[self.stateInfo setType:TBStateTypeMultiCode];

23

 

//...

24

}

 

25

 

 

26

//切换单码状态

27

- (void)processorC {

28

//...

29

[self.stateInfo setType:TBStateTypeSingleCode];

30

//...

31

}

 

 


最好根据状态机图编写状态切换代码,以保证每种状态都有对应的流转。

 

次态→ 初态↓

状态A

状态B

状态C

状态A

条件A

...

...

状态B

...

...

...

状态C

...

...

...


带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)https://developer.aliyun.com/article/1338218?groupCode=taobaotech

相关文章
|
12天前
|
JavaScript 前端开发 PHP
用swift开发ios移动端app应用初体验
直接跟着 apple 官方的 SwiftUI 教程跑的,写惯了 javascript 奔放的代码,很多语法理解起来还是有点费劲
25 1
|
13天前
|
移动开发 小程序 JavaScript
uniapp开发打包ios应用踩坑记
iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID
15 0
|
22天前
|
Web App开发 安全 iOS开发
TrollStore巨魔商店永久安装APP 可实现IOS应用双开 安装任意APP
TrollStore 是一个永久签名的监禁应用程序,可以永久安装您在其中打开的任何 IPA。
|
25天前
|
iOS开发
iOS应用内弹窗通知怎么实现?其实很简单,这样,这样,再这样.....你学会了么?
iOS应用内弹窗通知怎么实现?其实很简单,这样,这样,再这样.....你学会了么?
22 0
|
1月前
|
Unix 开发工具 iOS开发
iOS应用逆向工程笔记 -1
iOS应用逆向工程笔记 -1
20 0
|
1月前
|
Go iOS开发
iOS应用发布ITMS-90704错误解决
iOS应用发布ITMS-90704错误解决
10 0
|
1月前
|
移动开发 安全 数据安全/隐私保护
保护你的iOS应用,防止逆向破解
保护你的iOS应用,防止逆向破解
|
1月前
|
Android开发 iOS开发 UED
appuploader iOS 应用自动发布
appuploader iOS 应用自动发布
|
1月前
|
数据安全/隐私保护 iOS开发
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
|
1月前
|
存储 数据安全/隐私保护 Android开发
苹果IOS应用上架AppStore的流程与教程
苹果IOS应用上架AppStore的流程与教程
热门文章
最新文章
推荐文章
更多