應用背景:
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類,保證了靈活性,這個就是策略設計模式的好處。
目前對設計模式的理解停留在 這些都是套路,利用這些套路可以在未來 即使業務會發生改變的情況下,盡可能的少改代碼 或者說 對原有的代碼改動小