理解:其实就是把相似的算法封装起来
简单的类图:
小明有个魔法包,当他想使用魔法时,只需要取出对应的魔法卷轴,就可以使用相应的魔法了。
简略代码如下:
// 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.在写一个类用来管理、维护 这些算法类