objective-c设计模式之 --- 策略

本文探讨了策略模式在简化复杂条件语句、处理算法变体和避免暴露算法相关数据结构等方面的应用。通过实例展示了如何在控制器中引入策略模式,以及在不同验证策略类(如AlphaInputValidator和NumericInputValidator)中实现具体的验证逻辑。

我们先设想一个场景:把一堆算法塞到同一段代码里,然后用if - else 和switch - case 来决定使用哪个算法。

比如:表单验证,数据本身可能是NSString, NSInteger, NSFloat... 有时候不仅要验证类型还需要验证长度,或者还有其他的验证... 如果用if,有时候真感觉那是一场噩梦。 赶紧醒醒吧,加上一个策略模式。wow,世界顿时变得很美好。

何为策略模式:

官方定义:定义一系列算法,把他们一个个封装起来,并且是他们可以相互替换。这种模式使得算法可以独立于使用它的客户端而存在。

直接上例子:

有一个CustomTextField需要验证,然后就有一个InputValidator(验证的基类)以及一系列验证的子类, AlphaInputValidator, NumericInputValidator...

1. 在你的controller里面,入口处直接调用:

[(CustomTextField*)textField validate];

2. CustomTextField实现类:

@implementation CustomTextField

@synthesize inputValidator=inputValidator_;

- (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];

    [alertView release];

  }  

  return validationResult;

}

@end

@implementation InputValidator

// A stub for any actual validation strategy

- (BOOL) validateInput:(UITextField *)input error:(NSError **) error {

  if (error)  {

    *error = nil;

  }  

  return NO;

}

接着在 AlphaInputValidator,  NumericInputValidator里写相关的实现。

好了,现在对策略模式有些了解了。我们再来看看

何时使用策略模式:

1. 一个类在其操作中使用多个条件语句来定义许多行为。我们可以把条件分支移到他们自己的策略类里面。

2. 需要算法的各种变体。

3. 需要避免把复杂的,与算法相关的数据结构暴露给客户端。

转载于:https://my.oschina.net/megan/blog/142425

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值