2017.4.5 策略设计模式

2017-04-05  本文已影响5人  敲一手烂代码

应用背景:

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类,保证了灵活性,这个就是策略设计模式的好处。
目前对设计模式的理解停留在 这些都是套路,利用这些套路可以在未来 即使业务会发生改变的情况下,尽可能的少改代码 或者说 对原有的代码改动小

上一篇下一篇

猜你喜欢

热点阅读