源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-08-02 23:03 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS App设计模式开发中策略模式的实现示例
这次介绍一下策略模式(Strategy Pattern),相比之下是一种比较简单的模式。它也叫政策模式(Policy Pattern)。 策略模式使用的就是面向对象的继承和多态机制,其他的没有什么玄机。策略模式适合使用在: 1. 多个类只有在算法或行为上稍有不同的场景。 2. 算法需要自由切换的场景。 3. 需要屏蔽算法规则的场景。 使用策略模式当然也有需要注意的地方,那么就是策略类不要太多,如果一个策略家族的具体策略数量超过4个,则需要考虑混合模式,解决策略类膨胀和对外暴露问题。在实际项目中,我们一般通过工厂方法模式来实现策略类的声明。 下面我们就来具体讲解一下策略模式。 策略模式定义: Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且是它们之间可以互换。) 下面我把策略模式的类层次结构图展示如下: [img]http://files.jb51.net/file_images/article/201603/2016330112133305.jpg?2016230112149[/img] 如图所示,Strategy类层次为Context定义了一系列的可供重用的算法和行为,继承有助于析取出这些算法中的公共功能。下面我用一个普通超市里收费的例子简单模拟了这个模式。我把其中对应的类介绍一下: Context类———————————CashContext类 Strategy类———————————–CashSuper类 ConcreteStrategyA类—————-CashNormal类 ConcreteStrategyB类—————-CashRebate类 ConcreteStrategyC类—————-CashReturn类 好的,上面就是将要向大家展示的Objective C源代码类。 下面,我把上面对应的类展示出来,供大家参考: 注意:本文所有代码均在ARC环境下编译通过。 CashContext类接口
[u]复制代码[/u] 代码如下:
#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类实现
[u]复制代码[/u] 代码如下:
#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类接口
[u]复制代码[/u] 代码如下:
#import <Foundation/Foundation.h> @interface CashSuper :NSObject -(double)AcceptCash:(double)money; @end
CashSuper类实现
[u]复制代码[/u] 代码如下:
#import"CashSuper.h" @implementation CashSuper -(double)AcceptCash:(double)money{     return -1.0; //这里返回 -1.0无任何意义,只是为了定义此方法 } @end
CashNormal类接口
[u]复制代码[/u] 代码如下:
#import"CashSuper.h" @interface CashNormal :CashSuper @end
CashNormal类实现
[u]复制代码[/u] 代码如下:
#import"CashNormal.h" -(double)AcceptCash:(double)money{     return money; } @end
CashRebate类接口
[u]复制代码[/u] 代码如下:
#import"CashSuper.h" @interface CashRebate :CashSuper{ @private double moneyRebate; } @property double moneyRebate; -(CashRebate*)MyInit:(double)moneyRebates; @end
CashRebate实现
[u]复制代码[/u] 代码如下:
#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类接口
[u]复制代码[/u] 代码如下:
#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类实现
[u]复制代码[/u] 代码如下:
#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方法调用
[u]复制代码[/u] 代码如下:
#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环境下书写的,所以不需要手动释放其中的资源。所以有些传递指针地方没有进行手动释放,在此解释一下。 什么情况下需要用策略模式呢,其实我的理解是,当我们在分析需求的过程中,需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。另外,策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部