iOS Patterns. Strategy

Если Ваша девушка злая, вы скорее всего будете общаться с ней осторожно. Если на вашем проетке завал, то вероятнее всего вы не будете предлагать в команде вечерком дернуть пива или поиграть в компьютерные игры. В различных ситуациях, у нас могут быть очень разные стратегии поведения. К примеру, в приложении вы можете использовать различные алгоритмы сжатия, в зависимости от того с каким форматом картинки вы работаете, или же куда вы хотите после этого картинку деть. Вот мы и добрались до паттерна Стратегия.

Также отличным примером может быть MVC паттерн — в разных случаях мы можем использовать разные контроллеры для одного и того же View ( к примеру авторизированный и не авторизированный пользователь ).

Паттерн Стратегия определяет семейство алгоритмов, которые могут взаимозаменяться.

Когда использовать паттерн:

1. Вам необходимы различные алгоритмы

2. Вы очень не хотите использовать кучу вложеных If-ов

3. В различных случаях ваш класс работает по разному.

Давайте напишем пример — RPG игра, в которой у вас есть различные стратегии нападения Вашими персонажами:) Каждый раз когда вы делаете ход, ваши персонажи делают определенное действие. Итак, для начала управление персонажами! Создадим базовую стратегию:

@interface BasicStrategy : NSObject
-(void) actionCharacter1;
-(void) actionCharacter2;
-(void) actionCharacter3;
@end

Как видно из кода стратегии — у нас есть 3 персонажа, каждый из которых может совершать одно действие! Давайте научим персонажей нападать!

@interface AttackStrategy : BasicStrategy
@end

@implementation AttackStrategy
-(void) actionCharacter1
{
    NSLog(@"Character 1: Attack all enemies!");
}
-(void) actionCharacter2
{
    NSLog(@"Character 2: Attack all enemies!");
}
-(void) actionCharacter3
{
    NSLog(@"Character 3: Attack all enemies!");
}
@end

Как видим, при использовании такой стратегии наши персонажи нападают на все что движется! Давайте научим их защищаться:

@interface DefenceStrategy : BasicStrategy
@end

@implementation DefenceStrategy
-(void) actionCharacter1
{
    NSLog(@"Character 1: Attack all enemies!");
}

-(void) actionCharacter2
{
    NSLog(@"Character 2: Healing Character 1!");
}

-(void) actionCharacter3
{
    NSLog(@"Character 3: Protecting Character 2!");
}
@end

Как видим во время защитной стратегии, наши персонажи действуют по-другому — кто атакует, кто лечит, а некоторый даже защищают:) Ну, теперь как то надо это все использовать. Давайте создадим нашего игрока:

@interface Player : NSObject
@property (nonatomic, strong) BasicStrategy *_strategy;
-(void) makeAction;
-(void) changeStrategy:(BasicStrategy *) strategy;
@end

@implementation Player
-(void) makeAction
{
    [self._strategy actionCharacter1];
    [self._strategy actionCharacter2];
    [self._strategy actionCharacter3];
}

-(void) changeStrategy:(BasicStrategy *)strategy
{
    self._strategy = strategy;
}
@end

Как видим наш игрок может только менять стратегию и действовать в зависимости от этой стратегии.
Код для тестирования:

    Player *p = [[Player alloc] init];
    AttackStrategy *a = [[AttackStrategy alloc] init];
    DefenceStrategy *d = [[DefenceStrategy alloc] init];
    [p changeStrategy:a];
    [p makeAction];
    [p changeStrategy:d];
    [p makeAction];

Сосбтвенно все предельно ясно:) В первом случае наши персонажи будут активно атоковать, а после смены стратегии уйдут в глухую оборону. Традиционный лог:

2013-03-04 23:57:44.797 StrategyPatterns[22420:c07] Character 1: Attack all enemies!

2013-03-04 23:57:44.799 StrategyPatterns[22420:c07] Character 2: Attack all enemies!

2013-03-04 23:57:44.800 StrategyPatterns[22420:c07] Character 3: Attack all enemies!

2013-03-04 23:57:44.800 StrategyPatterns[22420:c07] Character 1: Attack all enemies!

2013-03-04 23:57:44.801 StrategyPatterns[22420:c07] Character 2: Healing Character 1!

2013-03-04 23:57:44.801 StrategyPatterns[22420:c07] Character 3: Protecting Character 2!

Код примера можно найти тут: https://github.com/dimko1/ios_patterns/tree/master/StrategyPatterns

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s