iOS 策略模式

策略模式

原文链接 : 链接
定义一系列的算法, 并且将每一个算法封装起来, 算法之间还可以相互替换
可以看下图来体会

图1.png

demo演示

需求简单做一个只接收字母, 只接收数字的demo, 验证登录

如下图所示:


图2.png

基本步骤

那么我们可以这样写--->( 此时全部在控制器中,并没有进行抽取 )
定义

@property (weak, nonatomic) IBOutlet UITextField *letterInput;//字母输入
@property (weak, nonatomic) IBOutlet UITextField *numberInput;//数字输入

算法

#pragma mark -验证输入
- (NSString*)letterInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//从开头到结尾,有效字符集合a-zA-Z或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];
NSString *outLetter = nil;
//判断,匹配不符合为0
if(numberOfMateches == 0){
outLetter = @"请重新输入";
}else{
outLetter = @"输入正确";
}
return outLetter;
}
- (NSString*)numberInput:(UITextField *)textField{
if(textField.text.length == 0){
return nil;
}
//从开头到结尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];
NSString *outLetter = nil;
//判断,匹配不符合为0
if(numberOfMateches == 0){
outLetter = @"请重新输入";
}else{
outLetter = @"输入正确";
}
return outLetter;
}

代理

#pragma mark -代理
- (void)textFieldDidEndEditing:(UITextField *)textField{
if(textField == self.letterInput){
//验证输入值
NSString *outPut = [self letterInput:textField];
if (outPut) {
NSLog(@"--%@",outPut);
}else{
NSLog(@"未输入");
}
}else if(textField == self.numberInput){
//验证是数字
NSString *outPut = [self numberInput:textField];
if (outPut) {
NSLog(@"--%@",outPut);
}else{
NSLog(@"未输入");
}
}
}

此时并没有进行抽取

策略模式进行抽取

图1.png

首先我们来根据上图的思路来创建一个抽象类---InputTextField类

声明

//策略输入 YES 通过
//NO 不通过
- (BOOL)inputTextField:(UITextField *)textField;
@property (nonatomic,copy)NSString *attributeInputStr;//属性字符

抽象方法

- (BOOL)inputTextField:(UITextField *)textField{
return NO;
}

场景类---CustomTextField

同样我们来声明一个BOOL类型验证方法, 并将抽象类导入, 之前属于一个聚合的关系

@property (nonatomic,strong)InputTextField *inputTextField;//抽象策略类
//验证方法
- (BOOL)isOK;

实现

- (BOOL)isOK{
BOOL result = [self.inputTextField inputTextField:self];
if(!result){
NSLog(@"--%@",self.inputTextField.attributeInputStr);
}
return result;
}

实现类---LetterInput, ---NumberInput, 这两个类全部是继承于抽象类的

此时我们开始写实现

- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"字母输入为空";
return nil;
}
//从开头到结尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];

//判断,匹配不符合为0
if(numberOfMateches == 0){
self.attributeInputStr = @"请重新输入";
}else{
self.attributeInputStr = @"输入正确";
}
return self.attributeInputStr == nil ? YES : NO;
}
- (BOOL)inputTextField:(UITextField *)textField{
if(textField.text.length == 0){
self.attributeInputStr = @"数字输入为空";
return nil;
}
//从开头到结尾,有效字符集合0-9或者更多
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
NSUInteger numberOfMateches = [regex numberOfMatchesInString:[textField text] options:NSMatchingAnchored range:NSMakeRange(0, [textField text].length)];

//判断,匹配不符合为0
if(numberOfMateches == 0){
self.attributeInputStr = @"请重新输入";
}else{
self.attributeInputStr = @"输入正确";
}
return self.attributeInputStr == nil ? YES : NO;
}

控制器中实现

父类指针指向子类对象

self.letterInput.inputTextField = [LetterInput new];
self.numberInput.inputTextField = [NumberInput new];

调用

- (void)textFieldDidEndEditing:(UITextField *)textField{
if ([textField isKindOfClass:[CustomTextField class]]) {
[(CustomTextField *)textField inputTextField];
}
}

总结

假如说我们又多了一个策略, 只需要再次增加一个类, 增加一个算法直接调用, 这样的话就在Controller中仅仅创建一个类就可以了, 对于后期的代码维护是不是方便了许多呢?
好了, 给大家这个简单demo, 当然在代码中也写了注释, 可以去我的git下载, 欢迎star
下载链接 : demo地址
技术交流q群150731459

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,137评论 9 62
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,144评论 2 16
  • 目录 本文的结构如下: 引言 什么是策略模式 模式的结构 典型代码 代码示例 策略模式和模板方法模式的区别 优点和...
    w1992wishes阅读 907评论 1 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,786评论 25 709
  • 遇见是我最喜欢的一个词。在我的世界里,遇见是一件非常美好的事情。 人生若只如初见,所有的美好都从遇见开始。也许有一...
    屋檐下023阅读 215评论 0 0