策略模式
来源:互联网 发布:python 多维高斯分布 编辑:程序博客网 时间:2024/05/16 08:46
理解:其实就是把相似的算法封装起来
简单的类图:
小明有个魔法包,当他想使用魔法时,只需要取出对应的魔法卷轴,就可以使用相应的魔法了。
简略代码如下:
// magicBag.h 魔法包typedef enum{ magicBagUseFire = 1, magicBagUseWater = 2 }magicBagUse;@interface magicBag : NSObject- (void)useMagicFrom:(magicBagUse)magic;@end
// magicBag.m#import "magicBag.h"#import "fire.h"#import "water.h"#import "magic.h"@implementation magicBag{ magic *_magic;}- (id)init{ if(self = [super init]) { _magic = [[magic alloc] init]; } return self;}- (void)useMagicFrom:(magicBagUse)magic{// 根据对应的名字生成对应的实例传入 switch (magic) { case magicBagUseFire: { [_magic setM:[[fire alloc] init]]; // 传入对应的实例 } break; case magicBagUseWater: { [_magic setM:[[water alloc] init]]; // 传入对应的实例 } break; default: break; } }@end
// magic.h 魔法基类@interface magic : NSObject@property (nonatomic,strong) magic *m;- (void)useMagic;// 使用魔法接口,用来给子类重载@end
// magic.m#import "magic.h"@implementation magic- (void)useMagic{ // 需要重载}- (void)setM:(magic *)m{ [m useMagic];// 在设置了m的同时直接调用函数}@end
// 火#import "fire.h"@implementation fire- (void)useMagic{ NSLog(@"使用火");}@end
// 水#import "water.h"@implementation water- (void)useMagic{ NSLog(@"使用水");}@end
// xiaoming.m 小明#import "magicBag.h" // 小明只要有魔法包就可以了,其他都不用管- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view. magicBag *m = [[magicBag alloc] init]; //实例化一个魔法包 [m useMagicFrom:magicBagUseFire]; // 使用火 [m useMagicFrom:magicBagUseWater];// 使用水 }
优点:
1.可以把所有类封装起来,不让人看到实现过程。如客户端(小明),只需要知道magicBag.h即可,其他我都把它打包了
2.当需要修改某个算法时,不会影响其他。如修改“水“,不会影响到火
3.增加新算法,开销小。如我要增加”土“魔法,只需要增加一个类,并在魔法包里添加进去即可
缺点:
1.算法多了,类也就越来越多了。如魔法越来越多,越来越细,那魔法包就越来越大了
什么时候用:
1.一个类中需要很多分支语句,你可以把它们移到你的策略类中
2.算法有很多种变化,但大体都相同
3.不想把实现过程让别人看见
理解:
1.定义一个抽象类(magic),让之类继承
2.在写一个类用来管理、维护 这些算法类
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- FMD开发文集 -- MFC调试模式下new操作符的特殊处理
- 算法系列(十九) 用天文方法计算日月合朔
- max sum
- 1019
- java50题----15升序排数
- 策略模式
- Windows下部署/配置/调试hadoop2.2
- ViewPager滑动 管理多个Fragment
- C语言API编写窗体界面和按钮
- paTJPSb桌趴缀岳凳钟涸
- 组合模式例子
- java50题----16九九乘法表
- iOS学习之sqlite的创建数据库,表,插入查看数据
- @responsebody(死循环)