金融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