责任链vs金融登录

金融app相对普通app而言,出于安全考虑,其安全校验方式比较多,以某些银行app为例,手机号登录成功后,会增加指纹、手势、OCR人脸等验证!这些安全项的校验,会根据用户的风险等级有不同的校验优先级,例如A客户的校验顺序是先指纹->手势->OCR,B客户的校验顺序可能是先手势->OCR,其验证顺序不固定,故此处用责任链的模式来设计更为合理:

demo地址:https://download.csdn.net/download/denggun12345/88104411?spm=1001.2014.3001.5503

//基类BusinessObject

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@class BusinessObject;

typedef void (^CompletionBlock)(BOOL handled);

typedef void (^ResultBlock)(BusinessObject *handler, BOOL handled);

@interface BusinessObject : NSObject

@property (nonatomic ,strong) UILabel *LB;

//下一个响应者

@property (nonatomic ,strong) BusinessObject *nextBusiness;

//响应者的处理方法

-(void)handle:(ResultBlock)result;

//各个业务在该方法当中做时机业务处理

-(void)handleBusiness:(CompletionBlock)completion;

@end

NS_ASSUME_NONNULL_END

#import "BusinessObject.h"

@implementation BusinessObject

//责任链入口方法

-(void)handle:(ResultBlock)result{

CompletionBlock completion = ^(BOOL handled){

//当前业务处理掉了,上抛结果

if(handled){

result(self,handled);

}else{

//沿着责任链,指派给下一个业务处理

if (self.nextBusiness){

**self**.nextBusiness handle:result\]; }**else**{ //没有业务处理,上抛 result(**nil** ,**NO**); } } }; //当前业务进行处理 \[**self** handleBusiness:completion\]; } -(**void**)handleBusiness:(CompletionBlock)completion{ //业务逻辑处理 //如不网络请求、本地照片查询等 } **@end** 模拟业务类,即继承基类的类,用来模拟指纹、手势、ocr的业务类 #import "BusinessObjectA.h" **@implementation** BusinessObjectA -(**void**)handleBusiness:(CompletionBlock)completion{ NSLog(@"BusinessObjectA"); **if** (\[**self**.LB.text isEqualToString:@"0"\]) { completion(**YES**); }**else**{ completion(**NO**); } } **@end** #import "BusinessObjectB.h" **@implementation** BusinessObjectB -(**void**)handleBusiness:(CompletionBlock)completion{ NSLog(@"BusinessObjectB"); **if** (\[**self**.LB.text isEqualToString:@"0"\]) { completion(**YES**); }**else**{ completion(**NO**); } } **@end** #import "BusinessObjectC.h" **@implementation** BusinessObjectC -(**void**)handleBusiness:(CompletionBlock)completion{ NSLog(@"BusinessObjectC"); **if** (\[**self**.LB.text isEqualToString:@"0"\]) { completion(**YES**); }**else**{ completion(**NO**); } } **@end** //模拟处理逻辑优先级 #import "ViewController.h" #import "BusinessObjectA.h" #import "BusinessObjectB.h" #import "BusinessObjectC.h" **@interface** ViewController () //背景变红色 **@property** (**nonatomic** ,**assign** ) **BOOL** isOuShu; **@property** (**weak** , **nonatomic** ) **IBOutlet** UILabel \*LBOne; **@property** (**weak** , **nonatomic** ) **IBOutlet** UILabel \*LBTwo; **@property** (**weak** , **nonatomic** ) **IBOutlet** UILabel \*LBThree; **@property** (**nonatomic** ,**strong**) NSArray \*testArray; **@property** (**weak** , **nonatomic** ) **IBOutlet** UIButton \*testBtn; **@end** **@implementation** ViewController -(NSArray \*)testArray{ **if**(!_testArray){ _testArray = @\[@1,@2,@3\]; } **return** _testArray; } - (**void**)viewDidLoad { \[**super** viewDidLoad\]; // Do any additional setup after loading the view.} - (**IBAction** )ClickAction:(**id**)sender { **int** x = arc4random() % 3;//0 1 2 模拟责任链中密码、手势、指纹的优先级 **self**.LBOne.text = \[NSString stringWithFormat:@"%d",x\]; **self**.LBTwo.text = \[NSString stringWithFormat:@"%d",x-1\]; **self**.LBThree.text = \[NSString stringWithFormat:@"%d",x-2\]; //开始责任链 //a指纹 BusinessObjectA \*objA = \[BusinessObjectA new\]; objA.LB = **self**.LBOne; \[objA handle:\^(BusinessObject \* **_Nonnull** handler, **BOOL** handled) { **if**(handled){ NSLog(@"a_yes_handler_test:%@",handler.LB.text); \[**self**.testBtn setTitle:@"LBOne" forState:UIControlStateNormal\]; }**else**{ NSLog(@"a_no_handler_test:%@",handler.LB.text); } }\]; //b手势 BusinessObjectB \*objB = \[BusinessObjectB new\]; objB.LB = **self**.LBTwo; objA.nextBusiness = objB; \[objB handle:\^(BusinessObject \* **_Nonnull** handler, **BOOL** handled) { **if**(handled){ NSLog(@"b_yes_handler_test:%@",handler.LB.text); \[**self**.testBtn setTitle:@"LBTwo" forState:UIControlStateNormal\]; }**else**{ NSLog(@"b_no_handler_test:%@",handler.LB.text); } }\]; //cOCR BusinessObjectC \*objC = \[BusinessObjectC new\]; objC.LB = **self**.LBThree; objB.nextBusiness = objC; \[objC handle:\^(BusinessObject \* **_Nonnull** handler, **BOOL** handled) { **if**(handled){ \[**self**.testBtn setTitle:@"LBThree" forState:UIControlStateNormal\]; NSLog(@"c_yes_handler_test:%@",handler.LB.text); }**else**{ NSLog(@"c_no_handler_test:%@",handler.LB.text); } }\]; } **@end**

相关推荐
HarderCoder7 小时前
iOS 知识积累第一弹:从 struct 到 APP 生命周期的全景复盘
ios
叽哥17 小时前
Flutter Riverpod上手指南
android·flutter·ios
用户092 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan2 天前
iOS26适配指南之UIColor
ios·swift
权咚2 天前
阿权的开发经验小集
git·ios·xcode
用户092 天前
TipKit与CloudKit同步完全指南
ios·swift
法的空间3 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918413 天前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
木头左3 天前
基于LSTM与3秒级Tick数据的金融时间序列预测实现
人工智能·金融·lstm
00后程序员张3 天前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview