【问题标题】:Strategy Design Pattern in Objective-CObjective-C 中的策略设计模式
【发布时间】:2015-09-15 04:58:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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,你可以去看看。

    【讨论】:

    • 感谢您的 cmets,所以 [self doesNotRecognizeSelector:_cmd] 只是对开发人员不小心调用父类上的方法的保护吧?
    • 没错。它对编译器没有影响。这只是一个公平的警告(在运行时),以防开发人员忘记覆盖其子类实现中的抽象方法之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多