当前位置: 首页 > 编程笔记 >

iOS App设计模式开发中策略模式的实现示例

阳文轩
2023-03-14
本文向大家介绍iOS App设计模式开发中策略模式的实现示例,包括了iOS App设计模式开发中策略模式的实现示例的使用技巧和注意事项,需要的朋友参考一下

这次介绍一下策略模式(Strategy Pattern),相比之下是一种比较简单的模式。它也叫政策模式(Policy Pattern)。 策略模式使用的就是面向对象的继承和多态机制,其他的没有什么玄机。策略模式适合使用在: 1. 多个类只有在算法或行为上稍有不同的场景。 2. 算法需要自由切换的场景。 3. 需要屏蔽算法规则的场景。 使用策略模式当然也有需要注意的地方,那么就是策略类不要太多,如果一个策略家族的具体策略数量超过4个,则需要考虑混合模式,解决策略类膨胀和对外暴露问题。在实际项目中,我们一般通过工厂方法模式来实现策略类的声明。

下面我们就来具体讲解一下策略模式。

策略模式定义:

Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且是它们之间可以互换。)

下面我把策略模式的类层次结构图展示如下:

如图所示,Strategy类层次为Context定义了一系列的可供重用的算法和行为,继承有助于析取出这些算法中的公共功能。下面我用一个普通超市里收费的例子简单模拟了这个模式。我把其中对应的类介绍一下:

Context类———————————CashContext类
Strategy类———————————–CashSuper类
ConcreteStrategyA类—————-CashNormal类
ConcreteStrategyB类—————-CashRebate类
ConcreteStrategyC类—————-CashReturn类
好的,上面就是将要向大家展示的Objective C源代码类。

下面,我把上面对应的类展示出来,供大家参考:

注意:本文所有代码均在ARC环境下编译通过。

CashContext类接口

#import <Foundation/Foundation.h> #import "CashSuper.h"

@interface CashContext :NSObject{ @private CashSuper *cs; } -(CashContext*)MyInit:(int)Types; -(void)SetCashSuper:(CashSuper*)cashSuper; -(double)GetResult:(double)money; @end


CashContext类实现

#import "CashContext.h" #import "CashNormal.h" #import "CashRebate.h" #import "CashReturn.h"

@implementation CashContext

-(CashContext*)MyInit:(int)Types{     int myTypes;     myTypes = Types;     switch(myTypes) {         case 1:             [self SetCashSuper:[[CashNormalalloc]init]];             break;         case 2:             [self SetCashSuper:[[CashReturnalloc]MyInit:300 And:100]];             break;         case 3:             [self SetCashSuper:[[CashRebatealloc]MyInit:0.8]];             break;         default:             break;     }     return self; } -(void)SetCashSuper:(CashSuper*)cashSuper{     cs = cashSuper; } -(double)GetResult:(double)money{     return [cs AcceptCash:money]; }

@end


CashSuper类接口

#import <Foundation/Foundation.h>

@interface CashSuper :NSObject -(double)AcceptCash:(double)money; @end


CashSuper类实现

#import"CashSuper.h"

@implementation CashSuper

-(double)AcceptCash:(double)money{     return -1.0; //这里返回 -1.0无任何意义,只是为了定义此方法 }

@end


CashNormal类接口

#import"CashSuper.h"

@interface CashNormal :CashSuper @end


CashNormal类实现

#import"CashNormal.h"

-(double)AcceptCash:(double)money{     return money; }

@end


CashRebate类接口

#import"CashSuper.h"

@interface CashRebate :CashSuper{ @private double moneyRebate; } @property double moneyRebate; -(CashRebate*)MyInit:(double)moneyRebates; @end


CashRebate实现

#import"CashRebate.h"

@implementation CashRebate @synthesize moneyRebate;

-(CashRebate*)MyInit:(double)moneyRebates{     [self setMoneyRebate:moneyRebates];     return self; } -(double)AcceptCash:(double)money{     return moneyRebate*money; }

@end


CashReturn类接口

#import "CashSuper.h"

@interface CashReturn :CashSuper{ @private double moneyCondition; @private double moneyReturn; } @property double moneyCondition; @property double moneyReturn; -(CashReturn*)MyInit:(double)moneyConditions And:(double)moneyReturns; @end


CashReturn类实现

#import "CashReturn.h"

@implementation CashReturn @synthesize moneyReturn; @synthesize moneyCondition;

-(CashReturn*)MyInit:(double)moneyConditions  And:(double)moneyReturns{     [self setMoneyReturn:moneyReturns];     [self setMoneyCondition:moneyConditions];     return self; } -(double)AcceptCash:(double)money{     double result;     result = money;     @try{         if(money >=moneyCondition){             result = money - (money /moneyCondition)*moneyReturn;         }     }     @catch(NSException *exception) {         NSLog(@"Oh!Man!!CashReturn has something wrong!");     }     @finally{         return result;     } }

@end


Main方法调用

#import <Foundation/Foundation.h> #import "CashContext.h"

int main (int argc, const char  *argv[]) {     @autoreleasepool {         CashContext *cc = [[CashContext alloc]MyInit:3];         double total;         total = [cc GetResult:400];         NSLog(@"Total Money 400,the resual is %f", total);     }     return 0; }


以上是对应的策略模式中相应的类,有一点需要声明的是,这些代码是在有ARC环境下书写的,所以不需要手动释放其中的资源。所以有些传递指针地方没有进行手动释放,在此解释一下。

什么情况下需要用策略模式呢,其实我的理解是,当我们在分析需求的过程中,需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。另外,策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

 类似资料:
  • 介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话,我们还要再次修改这段代码以增加逻辑,而且在进行单元测试的时候也会越来越复杂,代码如下: validato

  • 9. 策略(Strategy) Intent 定义一系列算法,封装每个算法,并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 Class Diagram Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。 Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy)

  • 本文向大家介绍iOS应用运用设计模式中的Strategy策略模式的开发实例,包括了iOS应用运用设计模式中的Strategy策略模式的开发实例的使用技巧和注意事项,需要的朋友参考一下   在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定要使用哪个算法?这些算法可能是一堆相似的类函数或方法,用以解决相关的问题。比如,一

  • 本文向大家介绍学习php设计模式 php实现策略模式(strategy),包括了学习php设计模式 php实现策略模式(strategy)的使用技巧和注意事项,需要的朋友参考一下 一、意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法 二、策略模式结构图   三、策略模式中主要角色 抽象策略(Strategy)角色

  • 本文向大家介绍PHP实现的策略模式示例,包括了PHP实现的策略模式示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现的策略模式。分享给大家供大家参考,具体如下: 个人觉得设计模式只有在实际应用中才能够慢慢的去熟悉,到最后做到心中有模式,事事有模式,哈哈 例如:一个电商首页,可以根据登陆用户的性别不同显示不同的内容,比如广告和商品类别。 传统方法:在程序内部使用多个if,else

  • 本文向大家介绍Python设计模式之策略模式实例详解,包括了Python设计模式之策略模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python设计模式之策略模式。分享给大家供大家参考,具体如下: 策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 运行

  • 本文向大家介绍Java设计模式之策略模式详解,包括了Java设计模式之策略模式详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1、策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。 定义如下: Define a family of algorithms,encapsulate

  • 本文向大家介绍学习JavaScript设计模式之策略模式,包括了学习JavaScript设计模式之策略模式的使用技巧和注意事项,需要的朋友参考一下 把不变的部分和变化的部分隔开是每个设计模式的主题。 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。 一、定义 定义一系列的算法,把它们一个个封装