设计模式--策略模式

引序:还记不记得这样的场景:把一堆算法塞到同一段代码中,然后使用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(   ){

...

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

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




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 本文的结构如下: 引言 什么是策略模式 模式的结构 典型代码 代码示例 策略模式和模板方法模式的区别 优点和...
    w1992wishes阅读 898评论 1 7
  • 概念及定义 概念在完成某一功能时,有时需要根据不同环境采取不同的策略或行为。将这些不同的策略或行为(称为算法)一一...
    maxwellyue阅读 575评论 0 0
  • 前言: 前两天写一个关于第三方库Masonry的源码分析,其中关于MASConstraintMaker, MASC...
    YYYYYY25阅读 6,914评论 1 5
  • 定义 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可...
    步积阅读 776评论 0 2
  • 在你最爱的时候你不想结婚,在你最想安定的时候遇到那个可能不是你最爱的人,或许这就是婚姻。你把青涩和挚爱都给了ta,...
    笃学青衿阅读 166评论 0 0