Как создать стратегическую модель в Objective C?

Я должен разработать стратегическую модель, где у меня есть основной класс с другими тремя классами, где я должен обратиться к объектам других трех классов с помощью основного объекта класса. Для решения это - стратегическая модель, поможет мне? Раз так дайте мне синтаксис в Objective C?

12
задан Cathy 10 February 2010 в 03:12
поделиться

1 ответ

Вы захотите взглянуть на механизм протокола 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];
}

Это общий шаблон Какао, называемый делегирование . Для получения дополнительной информации о делегировании и других шаблонах проектирования в Какао, см. .

39
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: