Я должен разработать стратегическую модель, где у меня есть основной класс с другими тремя классами, где я должен обратиться к объектам других трех классов с помощью основного объекта класса. Для решения это - стратегическая модель, поможет мне? Раз так дайте мне синтаксис в Objective C?
Вы захотите взглянуть на механизм протокола Objective-C .Вот простой протокол с единственным обязательным методом:
@protocol Strategy <NSObject>
@required
- (void) execute;
@end
Затем вы объявляете класс, который выполняет этот протокол:
@interface ConcreteStrategyA : NSObject <Strategy>
{
// ivars for A
}
@end
Реализация должна предоставлять метод -execute
(поскольку он был объявлен как @ требуется
):
@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];
}
Это общий шаблон Какао, называемый делегирование . Для получения дополнительной информации о делегировании и других шаблонах проектирования в Какао, см. .