iOS应用运用设计模式中的Strategy策略模式的开发实例

2020-01-14 22:14:28刘景俊
易采站长站为您分析iOS应用开发中对设计模式中的Strategy策略模式的运用,例子采用传统的Objective-C语言代码演示,需要的朋友可以参考下  

  在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题。比如,一个验证输入数据的例程,数据本身可以是任何数据类型(如NSString、CGFloat等),每种数据类型需要不同的验证算法。如果能把每个算法封装成一个对象,那么就能消除根据数据类型决定使用什么算法的一堆if-else或switch-case语句。


    我们把相关算法分离为不同的类,称为策略模式。策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户端而变化。

    在以下情形下,我们应该考虑使用策略模式。
    @:一个类在其操作中,使用多个条件语句来定义许多行为,我们可以把相关的条件分支移到它们自己的策略类中。
    @:需要算法的各种变体。
    @:需要避免把复杂的、与算法相关的数据结构暴漏给客户端。

    我们用一个简单的例子来说明以下,策略模式是怎么使用的。假设有两个UITextField,一个UITextField只能输入字母,另一个UITextField只能输入数字,为了确保输入的有效性,我们需要在用户结束文本框的编辑时做下验证。我们把数据验证放在代理方法textFieldDidEndEdting中。

    如果不使用策略模式,我们的代码会写成这样:

复制代码
- (void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField == self.numberTF) {
        // 验证其值只包含数字
        
    }else if (textField == self.alphaTF) {
        // 验证其值只包含字母
        
    }
}
    要是有更多不同类型的文本框,条件语句还会继续下去。如果能去掉这些条件语句,代码会更容易管理,将来对代码的维护也会容易许多。

 

    现在的目标是把这些验证检查提到各种策略类中,这样他们就能在代理方法和其他方法之中重用。每个验证都从文本框取出输入值,然后根据所H需的策略进行验证,最后返回一个BOOL值。如果返回失败,还会返回一个NSError实例。返回的NSError可以解释失败的原因。