应用背景:
int main(int argc, const char * argv[]) {
MYStrategyPattern *sp = [MYStrategyPattern new];
[sp testAction];
return 0;
}
这是一个普通的函数调用,需要用sp调用testAction方法,而当有一天我业务不满足的时候,我要么会改这个方法要么是添加新的方法,供sp实例去调用,形成如下状况:
int main(int argc, const char * argv[]) {
MYStrategyPattern *sp = [MYStrategyPattern new];
[sp testAction1];
[sp testAction2];
return 0;
}
总之是需要更改MYStrategyPattern这个类中的代码,但是为了灵活,我能不能达到上述目的而不更改MYStrategyPattern类中代码呢,就是这个场景 出现了策略 这个设计模式。
具体实现如下:
@protocol Action <NSObject>
- (void)action;
@end
@interface MYStrategyPattern : NSObject
@property (nonatomic, strong) id<Action> action;
- (void)testAction;
@end
@implementation MYStrategyPattern
- (instancetype)init {
self = [super init];
if (self) {
_action = [SpecificAction new];
}
return self;
}
- (void)testAction {
[_action action];
}
@end
@interface SpecificAction : NSObject <Action>
@end
@implementation SpecificAction
- (void)action {
NSLog(@"具体行为1");
}
@end
@interface SpecificAction1 : NSObject <Action>
@end
@implementation SpecificAction1
- (void)action {
NSLog(@"具体行为2");
}
@end
int main(int argc, const char * argv[]) {
MYStrategyPattern *sp = [MYStrategyPattern new];
[sp testAction]; //具体行为1
SpecificAction1 *a1 = [SpecificAction1 new];
sp.action = a1;
[sp testAction]; //具体行为2
SpecificAction *a2 = [SpecificAction new];
sp.action = a2;
[sp testAction]; //具体行为1
return 0;
}
如上,将行为抽象成一个接口,在具体使用的时候找到对应的行为实现类,赋值后再进行调用,这样我们保证了即使具体策略的更改,却不会影响MYStrategyPattern类,保证了灵活性,这个就是策略设计模式的好处。
目前对设计模式的理解停留在 这些都是套路,利用这些套路可以在未来 即使业务会发生改变的情况下,尽可能的少改代码 或者说 对原有的代码改动小
网友评论