你会想看看 Objective-C 的protocol 机制。这是一个简单的协议,只有一个必需的方法:
@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];
}
这是一种常见的 Cocoa 模式,称为 delegation。有关 Cocoa 中的委托和其他设计模式的更多信息,see this。