责任链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**

相关推荐
数据猿2 小时前
【金猿CIO展】莱商银行信息科技部总经理张勇:AI Infra与Data Agent驱动金融数据价值新十年
人工智能·金融
@大迁世界3 小时前
iOS 26.2 引入三种全新 iPhone 自定义方式
ios·iphone
Sheffi663 小时前
iOS 触摸事件完整传递链路:Hit-Test 全流程深度解析
macos·ios·cocoa
雷焰财经3 小时前
从“金桂奖”看金融创新:中和农信如何为乡村振兴引来金融“活水”
金融
低调电报3 小时前
技术王者局・鸿蒙 6.0 特性实战闯关:金融级应用安全与异构设备协同开发复盘
安全·金融·harmonyos
雷焰财经4 小时前
引金融“活水”精准滴灌,筑乡村振兴坚实根基——中和农信的普惠金融实践
金融
中电金信4 小时前
中电金信:智能辅助审单方案让跨境金融审核又快又准
大数据·金融
Swift社区4 小时前
用 Task Local Values 构建 Swift 里的依赖容器:一种更轻量的依赖注入思路
开发语言·ios·swift
2501_915909064 小时前
苹果应用加密方案的一种方法,在没有源码的前提下,如何处理 IPA 的安全问题
android·安全·ios·小程序·uni-app·iphone·webview