iOS App设计模式开发中策略模式的实现示例_IOS开发教程-查字典教程网
iOS App设计模式开发中策略模式的实现示例
iOS App设计模式开发中策略模式的实现示例
发布时间:2016-12-28 来源:查字典编辑
摘要:这次介绍一下策略模式(StrategyPattern),相比之下是一种比较简单的模式。它也叫政策模式(PolicyPattern)。策略模式...

这次介绍一下策略模式(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环境下书写的,所以不需要手动释放其中的资源。所以有些传递指针地方没有进行手动释放,在此解释一下。

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新IOS开发学习
    热门IOS开发学习
    编程开发子分类