Objective-C - 模板方法模式?

ary*_*axt 7 design-patterns objective-c template-method-pattern

所以我一直在阅读关于Objective-C的模板方法,我试图了解它们的特殊之处.根据我的理解,Base类中的任何方法都可以被覆盖并且可以调用super吗?那么模板方法不仅仅是覆盖基类中的方法吗?

如果我错了,你能解释一下模板方法模式是什么,你能提供一个例子吗?

Guv*_*ven 23

是的,模板模式不仅仅是覆盖基类中的方法.

当具体定义算法的轮廓时,可以使用模板模式,但算法的步骤是抽象的.这意味着这些步骤可以以不同的方式实现.但是,算法的总体轮廓预计不会改变.

我刚刚创建的一个例子:

class Life {

   public method goThroughTheDay(){
     goToWork();
     eatLunch();
     comeBackHome();
     programABitMore();
   }
   abstract method goToWork();
   abstract method eatLunch();
   abstract method comeBackHome();
   abstract method programABitMore();
}

class GoodLife extends Life {
   //override all the abstract methods here
}

//The client application
Life life = new GoodLife();
life.goThroughTheDay();
Run Code Online (Sandbox Code Playgroud)

基本上,预期一天的运行方式在Life类中具体定义.但是,该过程的细节由子类(即GoodLife)处理.GoodLife类的实现步骤与可能的ToughLife类完全不同.

这种模式有一些变化; 例如,某些步骤也可以具体定义.在这个例子中,eatLunch()可以在Life类中具体定义; 意味着不希望子类改变这种行为.

如果您有一个可以以不同方式实现的相对复杂的算法,那么该模式很有意义.

======================================

在我的回答中,我以某种方式错过了Objective-C的部分.以下是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

@interface GoodLife : Life

@end

@implementation GoodLife

- (void) goToWork { NSLog(@"Good Work"); }
- (void) eatLunch { NSLog(@"Good Lunch"); }
- (void) comeBackHome { NSLog(@"Good Comeback"); }
- (void) programABitMore { NSLog(@"Good Programming"); }

@end
Run Code Online (Sandbox Code Playgroud)

Objective-C没有对抽象类的内置支持,所以我使用该doesNotRecognizeSelector:方法解决了它.有关抽象类和Objective-C的更多详细信息,请参见此处.

  • 添加了Objective-C中的示例; 谢谢你的通知. (2认同)