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

相关推荐
白玉cfc1 小时前
【iOS】底层原理:分类、扩展和关联对象
ios·分类·数据挖掘
2601_955767422 小时前
观复盾护景贴:东方哲思与双护科技的深度实测
人工智能·科技·ios·iphone·圆偏振光·磁控溅射
会Tk矩阵群控的小木3 小时前
企业级iMessage群发系统实战:单主机管控多iPhone设备完整实现
运维·ios·开源软件·个人开发
睡不醒男孩0308233 小时前
行业解决方案一:CLup助力金融行业构建自主可控PostgreSQL高可用数据库平台
数据库·金融·clup
人月神话-Lee4 小时前
【图像处理】vImage/Accelerate——SIMD 让 CPU 也能飞
图像处理·深度学习·ios·cnn·ai编程·swift
万能小林子4 小时前
如何将网页在线转APP?5种打包工具对比速成指南(含在线/手机/电脑方案)
android·ios·uni-app·web app·wap2app·app打包·app封装
wayz114 小时前
Momentum:CTI(相关趋势指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
2601_955767425 小时前
iPhone 17屏幕反光怎么解?磁控溅射AR膜实测反射率低至0.5%
ios·ar·iphone·#观复盾护景贴·scinique双护技术
盼小辉丶5 小时前
PyTorch深度学习实战(56)——在iOS上构建PyTorch应用
pytorch·深度学习·ios
for_ever_love__14 小时前
UI学习:UISearchController基础了解和应用
学习·ui·ios·objective-c