Objective-C 中的策略设计模式

Strategy Design Pattern in Objective-C

我来自 Java,我正在重温 Head First Design Patterns 一书(一些开发人员认为这是设计模式的圣经)。我正在尝试通过将 Java 翻译成 obj-c 来重新创建书中的 Duck Simulator,这就是我目前所拥有的:

https://github.com/ZnelArts/IOSDesignPatterns/tree/master/DesignPatterns/Strategy/DuckSimulator

此模拟器使用通过协议应用的策略模式。我的实施有 2 个问题:

1- 我不能让 Duck class 像 Java 版本那样抽象,在 Java 版本中,方法 "display()" 是抽象的并且应由 children classes.

实施

2- 我必须公开 Duck class 属性以便 children class 可以访问它们,这与 Java 中的私有属性不同可以通过 children classes.

看到

此解决方案的理想设计是什么?

您走在正确的道路上,并且在练习中很好地识别了 Objective-C 语言的局限性。

Objective-C 缺少以下工具:

1.有抽象方法

抽象方法限制有一个解决方法;您可以为抽象方法实现调用 [doesNotRecognizeSelector:]

这是一个 class 层次结构的示例,其中基础 class 是抽象的。有关详细信息,您也可以查看此 thread(在 Objective-C 中讨论模板设计模式)。

@interface Life : NSObject

- (void) goThroughTheDay;

- (void) goToWork; // Abstract
- (void) eatLunch; // Abstract
- (void) comeBackHome; // Abstract
- (void) programABitMore; // Abstract

@end

@implementation Life

- (void) goThroughTheDay {

    [self goToWork];
    [self eatLunch];
    [self comeBackHome];
    [self programABitMore];
}

- (void) goToWork { [self doesNotRecognizeSelector:_cmd]; }
- (void) eatLunch { [self doesNotRecognizeSelector:_cmd]; }
- (void) comeBackHome { [self doesNotRecognizeSelector:_cmd]; }
- (void) programABitMore { [self doesNotRecognizeSelector:_cmd]; }

@end

2。拥有受保护的成员和方法

Whosebug 上已经有很好的thread,你可以看看。