Objective C--策略模式

本文介绍了策略模式的概念和应用,通过一个超市收费的例子来解释如何使用策略模式。包括类层次结构图、ObjectiveC源代码类及具体实现,展示了如何根据不同情况选择不同的算法或行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  今天,介绍一下策略模式。

  策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用类之间的耦合。

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


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

  • Context类-------------------------CashContext类

  • Strategy类---------------------------CashSuper类

  • ConcreteStrategyA类-------------CashNormal类

  • ConcreteStrategyB类-------------CashRebate类

  • ConcreteStrategyC类-------------CashReturn类

好的,上面就是将要向大家展示的Objective C源代码类。

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

  • CashContext类接口

1
2
3
4
5
6
7
8
9
10
#import <Foundation/Foundation.h>
#import "CashSuper.h"
                        
@interfaceCashContext:NSObject{
@privateCashSuper *cs;
}
-(CashContext*)MyInit:(int)Types;
-(void)SetCashSuper:(CashSuper*)cashSuper;
-(double)GetResult:(double)money;
@end
  • CashContext类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#import "CashContext.h"
#import "CashNormal.h"
#import "CashRebate.h"
#import "CashReturn.h"
                      
@implementationCashContext
                      
-(CashContext*)MyInit:(int)Types{
   intmyTypes;
   myTypes = Types;
   switch(myTypes) {
   case1:
      [selfSetCashSuper:[[CashNormalalloc]init]];
      break;
   case2:
      [selfSetCashSuper:
      [[CashReturnalloc]MyInit:300 And:100]];
      break;
   case3:
      [selfSetCashSuper:[[CashRebatealloc]MyInit:0.8]];
      break;
   default:
      break;
  }
 returnself;
}
-(void)SetCashSuper:(CashSuper*)cashSuper{
   cs = cashSuper;
}
-(double)GetResult:(double)money{
  return[cs AcceptCash:money];
}
                      
@end
  • CashSuper类接口

1
2
3
4
5
#import <Foundation/Foundation.h>
                    
@interfaceCashSuper:NSObject
-(double)AcceptCash:(double)money;
@end
  • CashSuper类实现

1
2
3
4
5
6
7
8
9
#import"CashSuper.h"
                  
@implementationCashSuper
                  
-(double)AcceptCash:(double)money{
   return-1.0; //这里返回 -1.0无任何意义,只是为了定义此方法
}
                  
@end
  • CashNormal类接口

1
2
3
4
5
#import"CashSuper.h"
                
@interfaceCashNormal :CashSuper
                
@end
  • CashNormal类实现

1
2
3
4
5
6
7
8
9
#import"CashNormal.h"
               
@implementationCashNormal
               
-(double)AcceptCash:(double)money{
   returnmoney;
}
               
@end
  • CashRebate类接口

1
2
3
4
5
6
7
8
#import"CashSuper.h"
             
@interfaceCashRebate:CashSuper{
@privatedouble moneyRebate;
}
@propertydouble moneyRebate;
-(CashRebate*)MyInit:(double)moneyRebates;
@end
  • CashRebate类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import"CashRebate.h"
           
@implementationCashRebate
@synthesizemoneyRebate;
           
-(CashRebate*)MyInit:(double)moneyRebates{
   [selfsetMoneyRebate:moneyRebates];
   returnself;
}
-(double)AcceptCash:(double)money{
   returnmoneyRebate*money;
}
           
@end
  • CashReturn类接口

1
2
3
4
5
6
7
8
9
10
#import "CashSuper.h"
         
@interfaceCashReturn:CashSuper{
@privatedouble moneyCondition;
@privatedouble moneyReturn;
}
@propertydouble moneyCondition;
@propertydouble moneyReturn;
-(CashReturn*)MyInit:(double)moneyConditions And:(double)moneyReturns;
@end
  • CashReturn类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import "CashReturn.h"
       
@implementationCashReturn
@synthesizemoneyReturn;
@synthesizemoneyCondition;
       
-(CashReturn*)MyInit:(double)moneyConditions    And:(double)moneyReturns{
   [selfsetMoneyReturn:moneyReturns];
   [selfsetMoneyCondition:moneyConditions];
   returnself;
}
-(double)AcceptCash:(double)money{
   doubleresult;
   result = money;
@try{
   if(money >=moneyCondition){
       result = money - (money /moneyCondition)*moneyReturn;
   }
}
@catch(NSException*exception) {
   NSLog(@"Oh!Man!!CashReturn has something wrong!");
}
@finally{
      returnresult;  
   }
}
       
@end
  • Main方法调用

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <Foundation/Foundation.h>
#import "CashContext.h"
   
intmain (intargc, constchar  *argv[])
{
    @autoreleasepool{
        CashContext *cc = [[CashContext alloc]MyInit:3];
        doubletotal;
        total = [cc GetResult:400];
        NSLog(@"Total Money 400,the resual is %f", total);
    }
    return0;
}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值