引序:还记不记得这样的场景:把一堆算法塞到同一段代码中,然后使用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( ){
...
}
要是有更多不同类型的文本框,条件语句还会继续下去。如果能去掉这些条件语句,代码会更容易管理,将来对代码的维护也会容易许多。
现在的目标是把这些验证检查提到各种策略类中,这样他们就能在代理方法和其他方法之中重用。









网友评论