策略(Startegy)模式

一個蘿蔔壹個坑發表於2017-12-22

基本概念

策略模式:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,不會影響到使用演算法的客戶。


策略(Startegy)模式

簡單策略的實現:

(1)建立Strategy的基類,定義所有Strategy都要實現的相同的方法,定義所有支援的演算法的公共介面,例如播放器有播放,停止等

@interface StragegyBaseObject : NSObject

- (void)tryStragegyLog;

- (void)play;

- (void)stop;

@end

#import "StragegyBaseObject.h"

@implementation StragegyBaseObject

@end

(2)建立兩個類,分別繼承StragegyBaseObject,實現所有的公用方法

#import "StragegyFirst.h"

@implementation StragegyFirst

- (void)tryStragegyLog

{

NSLog(@"StragegyFirst");

}

- (void)play

{

NSLog(@"StragegyFirst play");

}

- (void)stop

{

NSLog(@"StragegyFirst stop");

}

@end

#import "StagegySecond.h"

@implementation StagegySecond

- (void)tryStragegyLog

{

NSLog(@"StagegySecond");

}

- (void)play

{

NSLog(@"StagegySecond play");

}

- (void)stop

{

NSLog(@"StagegySecond stop");

}

@end

(3)建立context

#import <Foundation/Foundation.h>

#import "StragegyBaseObject.h"

typedef enum : NSUInteger {

StrategyContextTypeFirst,

StrategyContextTypeSecond,

} StrategyContextType;

@interface StrategyContext : NSObject

@property (nonatomic, strong)StragegyBaseObject *stragegy;

- (instancetype)initWithStrategyContextType:(StrategyContextType)type;

- (void)tryStragegyLog;

- (void)play;

- (void)stop;

@end

#import "StrategyContext.h"

#import "StragegyFirst.h"

#import "StagegySecond.h"

@implementation StrategyContext

- (instancetype)initWithStrategyContextType:(StrategyContextType)type

{

self = [super init];

if (self) {

switch (type) {

case StrategyContextTypeFirst:

{

self.stragegy = [[StragegyFirst alloc] init];

}

break;

case StrategyContextTypeSecond:

{

self.stragegy = [[StagegySecond alloc] init];

}

break;

default:

break;

}

}

return self;

}

- (void)tryStragegyLog

{

[self.stragegy tryStragegyLog];

}

- (void)play

{

[self.stragegy play];

}

- (void)stop

{

[self.stragegy stop];

}

@end

(4)最終呼叫

StrategyContext *context = [[StrategyContext alloc] initWithStrategyContextType:StrategyContextTypeSecond];

[context tryStragegyLog];

[context play];

環境(Context)角色:持有一個Strategy的引用;

抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類實現。此角色給出所有的具體策略類所需的介面;

具體策略(ConcreteStrategy)角色:包裝了相關的演算法或行為;

結論:

策略模式是一種定義一系列演算法的方法,從概念上來看,所有的演算法完成的都是相同的工作,他可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。

策略模式的Strategy類層次為Context定義了一些列可供重用的演算法或行為。繼承有助於析取出這些演算法中的公共功能

策略模式的優點是簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試

策略模式是用來封裝演算法的,但是實際中我們可以用他來封裝幾乎任何型別的規則,只要是在分析過程中需要不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性

基本的策略模式中,選擇所有具體實現的職責由客戶端物件承擔,並轉給策略模式的context物件

相關文章