美文网首页
设计模式--策略模式

设计模式--策略模式

作者: 明宝_ | 来源:发表于2018-06-06 16:37 被阅读0次

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

    一、何为策略模式

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

    二、组成

    —抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

    —具体策略角色:包装了相关的算法和行为。

    —环境角色:持有一个策略类的引用,最终给客户端调用。

    策略模式中一个关键角色是策略类,他为所有支持或相关的算法声明了一个共同接口。另外,还有使用策略接口来实现相关算法的具体策略类。  场景类(context)的对象配置有一个具体策略对象的实例,场景对象使用策略接口调用由具体策略类定义的算法。他们的静态关系如图:

    三、何时使用策略模式。 

    @:一个类在其操作中,使用多个条件语句来定义许多行为,我们可以把相关的条件分支移到它们自己的策略类中。 

    @:需要算法的各种变体。 

    @:需要避免把复杂的、与算法相关的数据结构暴漏给客户端。

    四、在UITextfeild 中应用验证策略

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

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

    (void)textFieldDidEndEditing:(UITextField *)textField { 

    if (textField == self.numberTF) { 

    // 验证其值只包含数字

    }else if (textField == self.alphaTF) { 

    // 验证其值只包含字母

    } else if(   ){

    } else if(   ){

    ...

    要是有更多不同类型的文本框,条件语句还会继续下去。如果能去掉这些条件语句,代码会更容易管理,将来对代码的维护也会容易许多。

    现在的目标是把这些验证检查提到各种策略类中,这样他们就能在代理方法和其他方法之中重用。

    相关文章

      网友评论

          本文标题:设计模式--策略模式

          本文链接:https://www.haomeiwen.com/subject/dnobsftx.html