首页 > 代码库 > 编程-策略模式

编程-策略模式

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

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

何为策略模式:

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

直接上例子:

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

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



[(CustomTextField*)textFieldvalidate];


2. CustomTextField实现类:


@implementationCustomTextField


@synthesizeinputValidator=inputValidator_;


- (BOOL)validate {

    

    NSError*error =nil;

    

    BOOLvalidationResult =[inputValidator_ validateInput:selferror:&error];

    

    if (!validationResult)  {

        

        UIAlertView*alertView =[[UIAlertView alloc]initWithTitle:[error localizedDescription]

                                  

                                                            message:[error localizedFailureReason]

                                  

                                                           delegate:nil

                                  

                                                  cancelButtonTitle:NSLocalizedString(@"OK",@"")

                                  

                                                  otherButtonTitles:nil];

        

        [alertViewshow];

        

        [alertViewrelease];

        

    }

    

    returnvalidationResult;

    

}


@end



@implementationInputValidator


// Astub forany actualvalidation strategy


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

    

    if (error)  {

        

        *error= nil;

        

    }  

    

    returnNO;

    

}


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

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

何时使用策略模式:

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

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

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



编程-策略模式