2011-11-16 31 views
6

Vì vậy, tôi đã đọc về các phương thức mẫu trên Objective-C và tôi đang cố gắng hiểu những gì đặc biệt về chúng. Từ sự hiểu biết của tôi bất kỳ phương pháp trong một lớp cơ sở có thể được over-ridden và siêu có thể được gọi là? Vì vậy, là một phương pháp mẫu bất cứ điều gì nhiều hơn trọng một phương pháp trong lớp cơ sở?Mục tiêu-C - Mẫu phương thức mẫu?

Nếu tôi sai, bạn có thể giải thích mẫu mẫu phương thức mẫu là gì không và bạn có thể cung cấp ví dụ không?

+1

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

Trả lời

21

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.

+0

Câu hỏi cụ thể yêu cầu thực hiện mục tiêu-C, nhưng bạn đã sử dụng những gì trông giống như Java. Bạn có thể cung cấp một tương đương Objective-C tốt không? Theo như tôi biết không có từ khóa trừu tượng, hoặc bất kỳ khái niệm tương đương, trong Mục tiêu-C. –

+0

-1 vì câu trả lời không được đặt trong ngữ cảnh Mục tiêu-C. – matm

+0

Nếu có thể, tôi cũng vậy -1. –

1

Từ sự hiểu biết của tôi, bất kỳ phương pháp nào trong lớp Cơ sở đều có thể bị ghi đè và siêu có thể được gọi? Vì vậy, là một phương pháp mẫu bất cứ điều gì nhiều hơn trọng một phương pháp trong lớp cơ sở?

Vâng, đây là nhiều hơn nữa chỉ ghi đè phương pháp lớp cơ sở. Các phương thức mẫu là một cách để thực hiện một thuật toán trong đó một số bước phụ thuộc vào lớp con. Ví dụ, xem xét một phương pháp trong cơ sở có ba bước chính, f1, f2 và f3. Mỗi bước chứa một số câu lệnh. Ở đây f1 và f3 giống nhau trong tất cả các phân lớp, nhưng f2 phụ thuộc vào lớp con. Vậy phải làm gì ở đây? Bạn có thể ghi đè toàn bộ phương thức trong các câu lệnh sao chép lớp con của f1 và f3, nhưng đó là một sự lãng phí. Vì vậy, bạn chỉ cung cấp f2 trong phân lớp. Và đây là cách bạn xác định thuật toán (thực hiện f1, sau đó thực hiện f2, sau đó thực thi f3) trong lớp cơ sở nhưng cung cấp các móc ghi đè cho các lớp con (f2). Lưu ý rằng, phương thức mẫu trong lớp cơ sở là cuối cùng, vì vậy lớp con không thể thay đổi thuật toán, ví dụ: nó không thể thay đổi thứ tự của f1, f2 và f3, không phải lớp con nào cũng có thể bỏ qua các bước f1, f3.

Tóm lại, mẫu Phương thức mẫu không chỉ là trọng số, đó là việc sử dụng thừa kế để xử lý một số tình huống cụ thể. Đây không phải là Obj-C cụ thể, và tôi không thể cung cấp cho bạn bất cứ điều gì cụ thể cho Obj-C. Để có được một ý tưởng chung về mô hình này, tôi khuyên các nội dung sau:

  1. Design Patterns book by GoF
  2. Head First Design Patterns
  3. Wikipedia article on Template Method

Và cũng có tấn các hướng dẫn/bài báo trên web. Ý tưởng cơ bản không phụ thuộc vào Obj-C.

2

Tôi nghĩ tôi nên đưa ra một câu trả lời cụ thể hơn cho mục tiêu C. Bạn có thể đọc về các phương pháp mẫu như được sử dụng trong ca cao trên táo Cocoa Design Patterns pages. Một ví dụ về điều này là phương thức mẫu drawRect:. Giống như các phương thức mẫu khác, bạn không bao giờ gọi trực tiếp các phương thức mẫu. Nó được gọi là setNeedsDisplay. Điểm của điều này là để cho phép khuôn khổ tối ưu hóa bản vẽ. Nếu bạn tự gọi trực tiếp drawRect:, bạn có thể sẽ phải thực hiện lại nhiều lần không cần thiết.

Trong thực tế, bạn nên cố gắng thực hiện mọi phương thức bạn muốn ghi đè trong một lớp con một phương thức mẫu. Điều này làm giảm vấn đề của việc biết liệu bạn nên gọi thực hiện lớp cơ sở khi bạn ghi đè và làm cho gỡ lỗi dễ dàng hơn. Bạn chỉ có thể đặt một điểm ngắt trong lớp cơ sở, thay vì mọi phương thức ghi đè trong các lớp con.

Các vấn đề liên quan