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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值