Вы захотите взглянуть на механизм протокола Objective-C . Вот простой протокол с одним обязательным методом:
@protocol Strategy <NSObject>
@required
- (void) execute;
@end
Затем вы объявляете класс, который выполняет этот протокол:
@interface ConcreteStrategyA : NSObject <Strategy>
{
// ivars for A
}
@end
Реализация должна предоставлять метод -execute
(поскольку он был объявлен как @required
):
@implementation ConcreteStrategyA
- (void) execute
{
NSLog(@"Called ConcreteStrategyA execute method");
}
@end
Вы можете создать аналогичный ConcreteStrategyB
класс, но я не собираюсь его здесь показывать.
Наконец, создайте контекстный класс со свойством, поддерживающим текущую стратегию.
@interface Context : NSObject
{
id<Strategy> strategy;
}
@property (assign) id<Strategy> strategy;
- (void) execute;
@end
Вот реализация. Метод, который делегирует методу -execute
стратегии, также называется -execute, но это не обязательно.
@implementation Context
@synthesize strategy;
- (void) execute
{
[strategy execute];
}
@end
Теперь я сделаю несколько экземпляров и задействую их:
ConcreteStrategyA * concreteStrategyA = [[[ConcreteStrategyA alloc] init] autorelease];
ConcreteStrategyB * concreteStrategyB = [[[ConcreteStrategyB alloc] init] autorelease];
Context * context = [[[Context alloc] init] autorelease];
[context setStrategy:concreteStrategyA];
[context execute];
[context setStrategy:concreteStrategyB];
[context execute];
Вывод консоли показывает, что стратегия была успешно изменена:
2010-02-09 19:32:56.582 Strategy[375:a0f] Called ConcreteStrategyA execute method
2010-02-09 19:32:56.584 Strategy[375:a0f] Called ConcreteStrategyB execute method
Обратите внимание, что если в протоколе не указано @required
, метод является необязательным. В этом случае контекст должен проверить, реализует ли стратегия метод:
- (void) execute
{
if ([strategy respondsToSelector:@selector(execute)])
[strategy execute];
}
Это обычный шаблон Какао, называемый Delegation . Для получения дополнительной информации о делегировании и других шаблонах проектирования в Какао, см. Это .