时间:2021-05-20
这次介绍一下策略模式(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环境下书写的,所以不需要手动释放其中的资源。所以有些传递指针地方没有进行手动释放,在此解释一下。
什么情况下需要用策略模式呢,其实我的理解是,当我们在分析需求的过程中,需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。另外,策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在APP的混合模式开发,Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个UIWebView组件来作为混合模式开发的桥梁
在看《C++设计新思维》的时候,发现在一开始就大篇幅的介绍策略模式(policy),策略模式不属于经典设计模式中的一种,但是其实在我们日常的开发中是必不可少的。
本文实例讲述了PHP设计模式之策略模式原理与用法。分享给大家供大家参考,具体如下:策略模式(StrategyPattern)策略模式是对象的行为模式,用意是对一
本文实例讲述了Android编程设计模式之策略模式。分享给大家供大家参考,具体如下:一、介绍在软件开发中也常常遇到这样的情况:实现某一个功能可以有多种算法或者策
本文实例讲述了PHP实现的策略模式。分享给大家供大家参考,具体如下:个人觉得设计模式只有在实际应用中才能够慢慢的去熟悉,到最后做到心中有模式,事事有模式,哈哈例