Objective-C中的策略设计模式

时间:2015-06-28 19:05:09

标签: java objective-c oop design-patterns strategy-pattern

我来自Java,我正在重新审视Head First Design Patterns一书(根据一些开发人员的说法,它是设计模式的圣经)。我试图通过将Java翻译成obj-c来重新创建Duck Simulator,这就是我到目前为止所做的:

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

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

1-我不能像在Java版本中那样抽象Duck类,在Java版本上,方法“display()”是抽象的,应该由子类实现。

2-我必须公开Duck类属性,以便子类可以访问它们,这与Java中的子类可以看到私有属性的情况不同。

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

1 个答案:

答案 0 :(得分:1)

你走在正确的道路上,你已经很好地确定了练习中Objective-C语言的局限性。

Objective-C缺乏以下工具:

<强> 1。有抽象方法

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

以下是类层次结构的示例,其中基类是抽象的。有关更多详细信息,您还可以查看此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。拥有受保护的成员和方法

在Stackoverflow上已经有一个很好的thread,你可以检查一下。