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的更多详细信息,请参见此处.
| 归档时间: |
|
| 查看次数: |
7903 次 |
| 最近记录: |