Có, mẫu mẫu hơi nhiều hơn là chỉ ghi đè phương thức trong lớp cơ sở.
Mẫu mẫu có thể được sử dụng khi đường viền của thuật toán được xác định cụ thể, tuy nhiên các bước của thuật toán được để lại trừu tượng. Điều đó có nghĩa là các bước có thể được thực hiện theo nhiều cách khác nhau. Tuy nhiên, phác thảo chung của thuật toán sẽ không thay đổi.
Một ví dụ mà tôi đã tạo ra khi đang bay:
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();
Về cơ bản, cách một ngày dự kiến sẽ chạy xuống được quy định cụ thể trong lớp Life. Tuy nhiên, các chi tiết của quá trình được thực hiện bởi lớp con (ví dụ: GoodLife). Lớp GoodLife sẽ thực hiện các bước rất khác với lớp ToughLife có thể có.
Có một số biến thể đối với mẫu này; ví dụ một số bước cũng có thể được xác định cụ thể. Trong ví dụ này, hàm eatLunch() có thể được định nghĩa cụ thể trong lớp Life; có nghĩa là các lớp con sẽ không thay đổi hành vi này.
Mẫu có ý nghĩa rất nhiều nếu bạn có một thuật toán tương đối phức tạp có thể được triển khai theo nhiều cách khác nhau.
======================================
tôi bằng cách nào đó bỏ lỡ phần với Objective-C trong câu trả lời của tôi. Sau đây là cách nó sẽ tìm trong 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
Objective-C không có built-in hỗ trợ cho các lớp trừu tượng, vì vậy tôi làm việc xung quanh nó bằng cách sử dụng phương pháp doesNotRecognizeSelector:
. Rất nhiều chi tiết về các lớp trừu tượng & Mục tiêu-C có thể được tìm thấy here.
Nếu bạn nghe về mẫu thiết kế và nghĩ rằng "Không có gì nhiều," bạn chủ yếu là đúng. Nhiều người trong số họ là hiển nhiên. – morningstar