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

相关推荐
杭城小刘20 小时前
Weex 底层原理与 APM
ios·前端框架·weex
2501_924064111 天前
2025年移动应用渗透测试流程方案及iOS安卓测试方法对比
android·ios
Beth_Chan1 天前
Fixed Income - Certificate of Deposit / Bond
金融
鼹鼠SDN2 天前
【保姆教程】iPhone、iPad上玩电脑游戏 异地串流
ios·iphone·ipad·moonlight·sunshine·串流·科技数码
初级代码游戏2 天前
iOS开发 SwiftUI 2 : Image
ios·swiftui·swift
TheNextByte12 天前
如何在不使用 iCloud 的情况下备份 iPhone 短信
ios·iphone·icloud
quant_19862 天前
如何处理大规模行情数据:从源头到终端的实战教程
大数据·开发语言·经验分享·python·金融
denggun123452 天前
内存优化-(二)-oc&swift
ios·性能优化·cocoa·内存·swift
我要用代码向我喜欢的女孩表白2 天前
对象存储路径文件1TB以上文件比对,go语言
ios·golang·xcode
2501_916007472 天前
iPhone APP 性能测试怎么做,除了Instruments还有什么工具?
android·ios·小程序·https·uni-app·iphone·webview