Là sự kế thừa bối cảnh, như được thể hiện qua ví dụ Vịt của Mẫu thiết kế đầu tiên, không liên quan đến mẫu chiến lược?


10

Trong các mẫu thiết kế đầu tiên, nó dạy mẫu chiến lược bằng cách sử dụng ví dụ Vịt trong đó các lớp con khác nhau của Vịt có thể được chỉ định một hành vi cụ thể khi chạy. Theo hiểu biết của tôi, mục đích của mẫu chiến lược là thay đổi hành vi của một đối tượng trong thời gian chạy, tuy nhiên họ đang sử dụng sự kế thừa của Duck để thay đổi hành vi của nhiều loại Vịt.

Mô hình chiến lược

Sự liên quan?

Là sự kế thừa bối cảnh của Vịt không liên quan đến mẫu chiến lược hay là các loại Vịt khác nhau và cũng thay đổi hành vi của chúng là lý do chính đáng để sử dụng mẫu chiến lược? Các tình huống mà bạn cần thay đổi cả hai có phải là lý do chính đáng để sử dụng mô hình chiến lược không? Tại sao họ lại bao gồm điều này như ví dụ mẫu chiến lược?

Một ví dụ đơn giản

Tôi có thể đơn giản hóa ví dụ này bằng cách chỉ có một lớp Vịt (không có lớp dẫn xuất) không? Sau đó, khi thực hiện một đối tượng vịt, nó có thể được chỉ định các hành vi khác nhau dựa trên các trường hợp nhất định không phụ thuộc vào loại đối tượng của chính nó. Ví dụ: Thay đổi FlyBehavior dựa trên thời tiết hoặc thay đổi QuackBehavior dựa trên thời gian trong ngày hoặc mức độ đói của một con vịt. Tôi nhận ra điều này sẽ giải quyết một vấn đề khác với vấn đề trong cuốn sách, nhưng điều tôi đang tìm kiếm là một ví dụ mẫu chiến lược có liên quan để quay trở lại.

Ví dụ của tôi ở trên có tạo thành mô hình chiến lược không?

Biên tập:

Tôi đã thành công trong việc tìm ra 2 ví dụ mẫu chiến lược đơn giản hơn, tuân thủ chặt chẽ hơn việc chỉ là các mẫu chiến lược mà không cần kế thừa ngữ cảnh: Hunter.javasolver.py .

Câu trả lời:


7

Vâng, tôi nghĩ rằng bạn đang đi đúng hướng. Lớp sử dụng mẫu chiến lược không phải là một lớp con. Mẫu chiến lược là một thay thế cho kế thừa để sử dụng lại mã. Điều này trở lại với sự so sánh thậm chí rộng hơn về kế thừa và thành phần.

Từ các mẫu thiết kế: Các yếu tố của OOP tái sử dụng, bạn sẽ sử dụng mẫu chiến lược để

  • Tránh sự bùng nổ của các lớp con (do sự kết hợp của các hành vi)
  • Nếu bạn cần trao đổi hành vi trong thời gian chạy

Nếu bạn đã sử dụng tính kế thừa để thực hiện các hành vi Quack và Fly, bạn sẽ kết quả với tất cả các lớp con này để thể hiện tất cả các kết hợp của các hành vi.

  • FlyableQuackableDuck
  • FlyableSqeakableDuck
  • FlyableMuteDuck
  • NoFlyQuackableDuck
  • NoFlySqueakableDuck
  • NoFlyMuteDuck

Có quá nhiều lớp con làm cho việc duy trì khó khăn hơn, đó là lý do tại sao mô hình chiến lược được ưa chuộng trong trường hợp này. Bạn chỉ cần hai thuộc tính đóng gói Flyability và Quackability và bạn có thể trộn và kết hợp chúng mà không cần tạo các lớp mới.

Bạn cũng đã đề cập đến lợi ích trong thời gian chạy nếu thời tiết thay đổi thuộc tính Fly của vịt có thể được thay thế bằng vật thể NoFly do các điều kiện.

Điều này phù hợp với lời khuyên để ủng hộ thành phần hơn thừa kế khi có thể.


1

Tôi có thể đơn giản hóa ví dụ này bằng cách chỉ có một lớp Vịt (không có lớp dẫn xuất) không? Sau đó, khi thực hiện một đối tượng vịt, nó có thể được chỉ định các hành vi khác nhau dựa trên các trường hợp nhất định không phụ thuộc vào loại đối tượng của chính nó.

Chắc chắn rồi. Để có cảm hứng, hãy xem Phân tích và Thiết kế hướng đối tượng đầu tiên . Có một "Guitars của Rick" cho thấy sự bùng nổ của các lớp học nhạc cụ (âm nhạc) . Để khắc phục điều này, tất cả các hành vi khác nhau được gói trong một lớp "đặc tả", tuân thủ nguyên tắc đóng gói mà thay đổi .

Nhà máy trừu tượng - Xây dựng dựa trên bối cảnh

Đây là mô hình . BTW, lưu ý rằng nó sử dụng chính chiến lược.

Tập trung vào khái niệm, không triển khai ... Bạn có thể có "WeatherFactory" xây dựng các đối tượng đặc tả dựa trên điều kiện nắng hoặc mưa, v.v.

Bạn có thể có "nhà máy của các nhà máy" để xây dựng những thứ "NoFlyInFogQuackableMallard" đó. Và thực sự, đây là những gì mô hình Tóm tắt Nhà máy nói về. Vì vậy, có lẽ một DuckFactory để tạo ra các loại vịt thông thường, sau đó là WeatherFactory để cung cấp cho nó hành vi thời tiết sương mù đặc trưng cho loại vịt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.