iOS设计模式-策略模式

作者: 乔克蜀黍 | 来源:发表于2017-12-01 18:04 被阅读19次

    简介

    策略模式就是根据不同的程序场景来使用不同的策略,一般用在有if 判断或switch case中,可以避免把不同的逻辑算法写到一个逻辑判断中,使代码清晰结构化,便于代码维护。
    在iOS开发中策略模式由三部分构成,strategy(抽象策略类)、实现抽象类的具体策略(算法)、context(应用场景)。抽象策略类向外提供了实现不同具体策略的公共方法,实现策略的类一般是以继承的方式重写父类(抽象策略类)提供的公共方法来实现不同的具体策略,context类里维护一个strategy实例,根据实际场景来选择使用那个策略。

    举个🌰

    在开发中在app的登录或者其他的一些需要用户输入的功能,UITextField的内容输入必须按照一定的规则来输入。
    有两个UITextField,一个只允许输入字母,一个只允许输入数字,下面用策略模式来实现这一需求。


    需求.png
    代码实现

    创建抽象策略类

    #import <UIKit/UIKit.h>
    
    @interface InputTextFieldValidate : NSObject
    // 策略输入 YES 表示测试通过.No 表示测试不通过
    - (BOOL)validateInputTextField:(UITextField *)textField;
    
    @property (nonatomic, copy) NSString *attributeInputStr; /**< 属性字符串 */
    @end
    
    #import "InputTextFieldValidate.h"
    //默认返回NO
    @implementation InputTextFieldValidate
    - (BOOL)validateInputTextField:(UITextField *)textField {
        return NO;
    }
    @end
    

    判断字母输入策略,继承于抽象策略类

    #import "InputTextFieldValidate.h"
    @interface LatterTextFieldValidate : InputTextFieldValidate
    @end
    `````````````````分割线``````````````
    #import "LatterTextFieldValidate.h"
    
    @implementation LatterTextFieldValidate
    
    - (BOOL)validateInputTextField:(UITextField *)textField {
        if (textField.text.length == 0) {
            self.attributeInputStr = @"字母不能是空的";
            return nil;
        }
        
        // ^[a-zA-Z]*$ 从开头(^)到结尾($), 有效字符集([a-zA-Z])或者更多(*)个字符
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
        
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [[textField text] length])];
        
    //    NSString *outLatter = nil;
        // 进行判断,匹配不符合表示0的话, 就走下面的逻辑
        if (numberOfMatches == 0) {
            self.attributeInputStr = @"不全是字母, 输入有误,请重新输入";
        } else {
            self.attributeInputStr = @"输入正取,全部是字母";
        }
        return self.attributeInputStr == nil ? YES : NO;
    }
    @end
    

    判断数字输入策略,继承于抽象策略类

    #import "InputTextFieldValidate.h"
    
    @interface NumberTextFieldValidate : InputTextFieldValidate
    
    @end
    ````````````````分割线```````````````````
    #import "NumberTextFieldValidate.h"
    
    @implementation NumberTextFieldValidate
    - (BOOL)validateInputTextField:(UITextField *)textField {
        if (textField.text.length == 0) {
            self.attributeInputStr = @"数值不能是空的";
            return nil;
        }
        
        // ^[a-zA-Z]*$ 从开头(^)到结尾($), 有效字符集([a-zA-Z])或者更多(*)个字符
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
        
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [[textField text] length])];
        
        //    NSString *outLatter = nil;
        // 进行判断,匹配不符合表示0的话, 就走下面的逻辑
        if (numberOfMatches == 0) {
            self.attributeInputStr = @"不全是数字, 输入有误,请重新输入";
        } else {
            self.attributeInputStr = @"输入数字,全部是字母";
        }
        
        return self.attributeInputStr == nil ? YES : NO;
    }
    
    @end
    

    创建应用场景类(context),继承于UITextField,内部维护一个抽象策略类的实例,根据场景的不同调用不同的策略

    #import <UIKit/UIKit.h>
    #import "InputTextFieldValidate.h"
    
    @interface CustomTextField : UITextField
    
    // 抽象的策略
    @property (nonatomic, strong) InputTextFieldValidate *inputValidate;
    
    // 验证是否符合要求
    - (BOOL)validate;
    @end
    ``````````````````````分割线 `````````````````````````
    #import "CustomTextField.h"
    
    @implementation CustomTextField
    - (BOOL)validate {
        BOOL result = [self.inputValidate validateInputTextField:self];
        if (!result) {
            NSLog(@"---%@",self.inputValidate.attributeInputStr);
        }
        return result;
    }
    @end
    

    调用

    #import "ViewController.h"
    #import "CustomTextField.h"
    #import "LatterTextFieldValidate.h"
    #import "NumberTextFieldValidate.h"
    
    @interface ViewController () <UITextFieldDelegate>
    @property (weak, nonatomic) IBOutlet CustomTextField *letterInput; /**< 字母输入 */
    @property (weak, nonatomic) IBOutlet CustomTextField *numberInput; /**< 数字输入 */
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        self.letterInput.delegate = self;
        self.numberInput.delegate = self;
        
        // 初始化
        self.letterInput.inputValidate = [LatterTextFieldValidate new];
        self.numberInput.inputValidate = [NumberTextFieldValidate new];
    
    }
    
    - (IBAction)btnClick:(id)sender {
        [self.view endEditing:YES];
    }
    
    #pragma mark - UITextFieldDelegate
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        if ([textField isKindOfClass:[CustomTextField class]]) {
            [(CustomTextField *)textField validate];
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS设计模式-策略模式

        本文链接:https://www.haomeiwen.com/subject/hzwpbxtx.html