定義
定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換
解決問(wèn)題
在有多種算法相似的情況下晋修,使用 if...else 所帶來(lái)的復(fù)雜和難以維護(hù)邪铲。
角色
環(huán)境(Context)角色:持有一個(gè)Strategy的引用。
抽象策略(Strategy)角色:這是一個(gè)抽象角色混稽,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體策略類所需的接口噪窘。
具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為日戈。
場(chǎng)景舉例
1殷蛇、諸葛亮的錦囊妙計(jì),每一個(gè)錦囊就是一個(gè)策略劈榨。
2访递、旅行的出游方式,選擇騎自行車同辣、坐汽車拷姿,每一種旅行方式都是一個(gè)策略。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1旱函、算法可以自由切換响巢。
2、避免使用多重條件判斷棒妨。
3踪古、擴(kuò)展性良好。
缺點(diǎn)
1券腔、策略類會(huì)增多伏穆。 2、所有策略類都需要對(duì)外暴露纷纫。
使用條件
1枕扫、如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為辱魁,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為烟瞧。
2、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種染簇。
3燕刻、如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J狡鼠希@些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。
場(chǎng)景模擬
簡(jiǎn)單 的數(shù)學(xué)運(yùn)算
策略模式 UML 圖
策略模式
簡(jiǎn)單代碼
#import <Foundation/Foundation.h>
@protocol Strategy <NSObject>
-(int)doOperation:(int)num1 and:(int)num2;
@end
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface OperationAdd : NSObject<Strategy>
@end
#import "OperationAdd.h"
@implementation OperationAdd
-(int)doOperation:(int)num1 and:(int)num2{
NSLog(@"當(dāng)前算法加法");
return num2 + num1;
}
@end
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface OperationSubStract : NSObject<Strategy>
@end
#import "OperationSubStract.h"
@implementation OperationSubStract
-(int)doOperation:(int)num1 and:(int)num2
{
NSLog(@"當(dāng)前算法減法");
return num1 - num2;
}
@end
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface OperationMultiply : NSObject<Strategy>
@end
#import "OperationMultiply.h"
@implementation OperationMultiply
-(int)doOperation:(int)num1 and:(int)num2{
NSLog(@"當(dāng)前算法乘法");
return num1 * num2;
}
@end
#import <Foundation/Foundation.h>
#import "Strategy.h"
@interface Context : NSObject
@property (nonatomic,strong) id<Strategy> strategy;
-(void)calulate;
@end
#import "Context.h"
@implementation Context
-(void)calulate{
NSLog(@" 第一個(gè)數(shù)10 第二個(gè)數(shù)5 計(jì)算結(jié)果 %d", [self.strategy doOperation:10 and:5]);
}
@end
測(cè)試代碼
Context * context = [[Context alloc]init];
context.strategy = [OperationAdd new];
[context calulate];
context.strategy = [OperationMultiply new];
[context calulate];
context.strategy = [OperationSubStract new];
[context calulate];
測(cè)試結(jié)果
2018-04-11 15:19:58.572533+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 當(dāng)前算法加法
2018-04-11 15:19:58.572770+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 第一個(gè)數(shù)10 第二個(gè)數(shù)5 計(jì)算結(jié)果 15
2018-04-11 15:19:58.572981+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 當(dāng)前算法乘法
2018-04-11 15:19:58.573085+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 第一個(gè)數(shù)10 第二個(gè)數(shù)5 計(jì)算結(jié)果 50
2018-04-11 15:19:58.573271+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 當(dāng)前算法減法
2018-04-11 15:19:58.573370+0800 行為型設(shè)計(jì)模式-策略模式[70343:8738232] 第一個(gè)數(shù)10 第二個(gè)數(shù)5 計(jì)算結(jié)果 5
下一篇講解