策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用IOS简单实现一下。
所谓的策略模式,顾名思义是要采用不同的策略的。一般来说,在不同的情况下,处理某一个问题的方法也不一样。比如说对字符串的排序和对数字的排序,虽然用的都是快排,但是显然不可能使用一段通用的代码。有人说java里面的compareTo可以做到,但如果考虑这么一个问题:同样是出门旅行,老年人身体虚弱,需要大量的休息,而孩子则是精力充沛,希望玩到更多的景点。如何在同一模式下表达以上信息、采用合理的设计模式进行封装而不是大量重写类似的代码,就需要学习并采用策略模式。
例子
该例子主要利用策略模式来判断UITextField是否满足输入要求,比如输入的只能是数字,如果只是数字就没有提示,如果有其他字符则提示出错。验证字母也是一样。
首先,我们先定义一个抽象的策略类IputValidator。代码如下:
InputValidator.h
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h>static NSString * const InputValidationErrorDomain = @"InputValidationErrorDomain"; @interface InputValidator : NSObject
//实际验证策略的存根方法 -(BOOL)validateInput:(UITextField *)input error:(NSError **)error; @end
#import "InputValidator.h"
@implementation InputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error { if (error) { *error = nil; } return NO; } @end
#import "InputValidator.h"
@interface NumericInputValidator : InputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error; @end
#import "NumericInputValidator.h"@implementation NumericInputValidator
-(BOOL)validateInput:(UITextField *)input error:(NSError **)error { NSError *regError = nil; //使用配置的NSRegularExpression对象,检查文本框中数值型的匹配次数。 //^[0-9]*$:意思是从行的开头(表示为^)到结尾(表示为$)应该有数字集(标示为[0-9])中的0或者更多个字符(表示为*) NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]*$" options:NSRegularExpressionAnchorsMatchLines error:®Error]; NSUInteger numberOfMatches = [regex numberOfMatchesInString:[input text] options:NSMatchingAnchored range:NSMakeRange(0, [[input text] length])]; //如果没有匹配,就返回错误和NO if (numberOfMatches==0) { if (error != nil) { NSString *description = NSLocalizedString(@"Input Validation Faild", @""); NSString *reason = NSLocalizedString(@"The input can contain only numerical values", @""); NSArray *objArray = [NSArray arrayWithObjects:description,reason, nil]; NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey,NSLocalizedFailureReasonErrorKey ,nil]; NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray]; *error = [NSError errorWithDomain:InputValidationErrorDomain code:1001 userInfo:userInfo]; } return NO; } return YES; } @end
#import "InputValidator.h"@interface AlphaInputValidator : InputValidator
- (BOOL)validateInput:(UITextField *)input error:(NSError **)error; @end
#import "AlphaInputValidator.h" @implementation AlphaInputValidator-(BOOL)validateInput:(UITextField *)input error:(NSError **)error { NSError *regError = nil; //使用配置的NSRegularExpression对象,检查文本框中数值型的匹配次数。 //^[0-9]*$:意思是从行的开头(表示为^)到结尾(表示为$)应该有数字集(标示为[0-9])中的0或者更多个字符(表示为*) NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z]*$" options:NSRegularExpressionAnchorsMatchLines error:®Error]; NSUInteger numberOfMatches = [regex numberOfMatchesInString:[input text] options:NSMatchingAnchored range:NSMakeRange(0, [[input text] length])]; //如果没有匹配,就返回错误和NO if (numberOfMatches==0) { if (error != nil) { NSString *description = NSLocalizedString(@"Input Validation Faild", @""); NSString *reason = NSLocalizedString(@"The input can contain only letters ", @""); NSArray *objArray = [NSArray arrayWithObjects:description,reason, nil]; NSArray *keyArray = [NSArray arrayWithObjects:NSLocalizedDescriptionKey,NSLocalizedFailureReasonErrorKey ,nil]; NSDictionary *userInfo = [NSDictionary dictionaryWithObjects:objArray forKeys:keyArray]; *error = [NSError errorWithDomain:InputValidationErrorDomain code:1002 userInfo:userInfo]; } return NO; } return YES;
} @end
#import <UIKit/UIKit.h> @class InputValidator; @interface CustomTextField : UITextField@property(nonatomic,strong)InputValidator *inputValidator;
-(BOOL)validate; @end
#import "CustomTextField.h" #import "InputValidator.h" @implementation CustomTextField
-(BOOL)validate { NSError *error = nil; BOOL validationResult = [_inputValidator validateInput:self error:&error]; if (!validationResult) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription] message:[error localizedFailureReason] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil]; [alertView show]; } return validationResult; } @end
#import "ViewController.h" #import "CustomTextField.h" #import "NumericInputValidator.h" #import "AlphaInputValidator.h" @interface ViewController ()@end
@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; _numberTextField.inputValidator = [NumericInputValidator new]; _letterTextField.inputValidator = [AlphaInputValidator new]; // Do any additional setup after loading the view, typically from a nib. }
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - ValidButtonMehtod - (IBAction)validNumAction:(id)sender { [_numberTextField validate]; }
- (IBAction)validLetterAction:(id)sender { [_letterTextField validate]; } @end
优点
使用场景
总结
再总结一下策略方法的实现,本质上就是需要完成一个事情(出行),但是并不清楚需要使用怎样的策略,所以封装出一个函数,能够把需要的策略(young OR old)作为参数传递进来,并且使用相应的策略完成这个事件的处理。
最后简单谈一谈个人对于策略模式和面向对象中多态的思想的理解,首先多态是高层次,高度抽象的概念,独立于语言之外,是面向对象思想的精髓,而策略模式只是一种软件设计模式,相对而言更加具体,而且具体实现依赖于具体的编程语言,比如OC和java的实现方法并不相同,是language-dependent的。其次,多态更多强调的是,不同的对象调用同一个方法会得到不同的结果,而策略模式更多强调的是,同一个对象(事实上这个对象本身并不重要)在不同情况下执行不同的方法,而他们的实现方式又是高度类似的,即共享同一个父类并且各自重写父类的方法。
以上观点纯属个人愚见,欢迎大牛指正,互相交流。
本文向大家介绍举例讲解设计模式中的原型模式在iOS应用开发中的作用,包括了举例讲解设计模式中的原型模式在iOS应用开发中的作用的使用技巧和注意事项,需要的朋友参考一下 1 前言 在许多面向对象的应用程序中,有些对象的创建代价过于大或者过于复杂。要是可以重建相同的对象并作轻微的改动,事情会容易许多。我们可以通过轻微的改动重用已有的对象,以适应程序中的特定情况。今天我们就来学习一下该模式。 2 详述
本文向大家介绍iOS应用运用设计模式中的Strategy策略模式的开发实例,包括了iOS应用运用设计模式中的Strategy策略模式的开发实例的使用技巧和注意事项,需要的朋友参考一下 在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题。比如,一
本文向大家介绍举例讲解C#编程中对设计模式中的单例模式的运用,包括了举例讲解C#编程中对设计模式中的单例模式的运用的使用技巧和注意事项,需要的朋友参考一下 单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了,下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供
本文向大家介绍php设计模式之策略模式应用案例详解,包括了php设计模式之策略模式应用案例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php设计模式之策略模式应用。分享给大家供大家参考,具体如下: 策略模式 定义: 策略模式定义一系列的算法,将每个算法封装起来,并让它们可以相互装换。策略模式让算法独立于使用它的客户而独立变化。 角色分析: 抽象策略角色:策略类,通常由一个接口或者抽
本文向大家介绍iOS App设计模式开发中对迭代器模式的使用示例,包括了iOS App设计模式开发中对迭代器模式的使用示例的使用技巧和注意事项,需要的朋友参考一下 何为迭代器模式? 迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的策略
本文向大家介绍实例解析Ruby设计模式编程中Strategy策略模式的使用,包括了实例解析Ruby设计模式编程中Strategy策略模式的使用的使用技巧和注意事项,需要的朋友参考一下 今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会。要帮什么忙呢?你很好奇。 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的数据,现在需要完成一个选择性查询用户信息
本文向大家介绍iOS App设计模式开发中对interpreter解释器模式的运用,包括了iOS App设计模式开发中对interpreter解释器模式的运用的使用技巧和注意事项,需要的朋友参考一下 解释器模式 今天和大家分享的模式是解释器模式。 首先介绍一下解释器模式适合解决哪类问题。 其实,解释器模式需要解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述
本文向大家介绍iOS App设计模式开发中对建造者模式的运用实例,包括了iOS App设计模式开发中对建造者模式的运用实例的使用技巧和注意事项,需要的朋友参考一下 定义 "将一个复杂对象的构建与