2015-01-11 13 views
5

Tôi muốn hỏi điều gì đó về ví dụ vịt về cuốn sách này khiến tôi bối rối và tôi cảm thấy mâu thuẫn.Mẫu chiến lược mẫu vịt - Đầu mẫu thiết kế đầu tiên

  1. Vấn đề enter image description here

  2. kết luận enter image description here

Ông nói "khi joe thêm hành vi mới cho lớp cha vịt, ông cũng đã được bổ sung thêm hành vi đó không thích hợp cho Các phân lớp con vịt "

NHƯNG trong kết luận ông đã thêm performFly()performQuack(); điều gì là khác nhau bởi vì tôi nghĩ rằng nó giống với he was also adding behavior that was not appropiate for sume Duck subclasses?

** hình ảnh được lấy từ cuốn sách Đầu mẫu thiết kế đầu tiên ** câu hỏi này không nói cuốn sách này là không tốt, cuốn sách này thực sự là tốt trong quan điểm của tôi. đây chỉ là tôi, người đang hỏi cái gì đó mà tôi không nhận được từ cuốn sách.

+0

Tất cả những gì họ đã làm là lấy một hàm (quack) và tách nó thành một lớp riêng biệt. Đó là một chút phức tạp. Sẽ tốt hơn nếu đặt một lớp con vịt có tên là "FlyingDucks" và sau đó đặt Fly() vào đó. Sau đó, tất cả vịt bay sẽ kế thừa lớp đó. Cách khác, làm cho FLy() trừu tượng, buộc mọi phân lớp phải xác định ý nghĩa của nó để bay. Những gì họ làm là làm việc nhiều hơn và phức tạp hơn. Mỗi phân lớp cần chọn một lớp Fly để gán cho flyBehavior - ngay cả khi chúng không thể bay được. – kainaw

+0

Tôi có đúng không nếu tôi nói 'vấn đề' và' kết luận' là mâu thuẫn? hoặc tôi chỉ không hiểu ý anh ấy là gì? – Kakashi

+0

Nó sẽ là thiết kế tốt hơn để nhận ra rằng, cách thức (trang điểm) vấn đề là xem xét vịt, vịt cao su không phải là vịt - nó không bay, nó không bơi (trừ khi bạn bao gồm nổi), vv Nếu, vì lý do nào đó, bạn thực sự muốn có một lớp bao gồm vịt thật và vịt cao su, thì bạn nên tìm kiếm những điểm chung trong những thứ này, không gian vấn đề của bạn, và biến chúng thành những thuộc tính chung; không bắt đầu với các thuộc tính chung cho một số mục trong không gian của bạn và buộc phù hợp với các mục khác. – arcy

Trả lời

0

Kết luận, anh ta thêm hai lớp mới có hàm fly(). Tuy nhiên, chức năng này không phải lúc nào cũng làm cho con vịt bay. Vịt cao su không thể bay được, vì vậy chúng sử dụng một thể hiện của lớp FlyNoWay. Những con vịt khác có thể bay sử dụng một thể hiện của lớp FlyWithWings. Trường flyBehavior trong lớp Duck có thể sẽ được đặt trong hàm tạo.

Hàm performFly() sẽ gọi hàm fly() cho bất kỳ lớp nào được chọn.

Như đã nêu trong kainaw trong phần bình luận, đây là một giải pháp khá phức tạp. Tuy nhiên, nó vẫn có thể được sử dụng. Nói rằng bạn đang tạo ra một chương trình thiết kế vịt. Nếu người dùng chọn liệu con vịt có thể bay hay không, nó không thể được mã hóa cứng. Bạn có thể tạo một giá trị Boolean, nhưng bạn có thể cần phải xử lý các tình huống phức tạp hơn như hành vi. Bạn có thể cần một lớp học WildDuckBehaviorDomesticDuckBehavior, mỗi lớp có thông tin riêng về cách hành động. Về cơ bản, ví dụ trong cuốn sách là một phiên bản đơn giản về cách thức này sẽ được sử dụng.

+0

nhưng vịt cao su vẫn thừa kế "bay" mà "vịt cao su" không cần nó? – Kakashi

+0

@MuhammadRifkiMockie Tôi hơi hiểu sai biểu đồ, vì vậy tôi đã chỉnh sửa câu trả lời. Không giúp đỡ à? – FlyingPiMonster

3

Các mô hình chiến lược hoạt động khi bạn thành phần có lợi cho cơ nghiệphttp://en.wikipedia.org/wiki/Composition_over_inheritance

Đây là một thực hành tốt vì bạn có thể thay đổi hành vi của một lớp mà không cần phải thay đổi bất kỳ mã. Và bạn cũng không cần một loại cây lớn. Bạn cũng có thể thay đổi hành vi của một lớp động.

Điều gì trong ví dụ này là xác định "hành vi" trong lớp cha. Trong lớp cha, bạn xác định rằng Vịt có thể có hành vi bay và hành vi quacking. Nhưng nó không có nghĩa là các lớp học trẻ em phải có quack hoặc bay.

Bạn có thể có một con vịt nonflying và khi bạn gọi "bay" nó sẽ không làm gì bởi vì chúng ta sẽ có một hành vi "không bay".

Thay vì mã hóa cứng những gì một con vịt làm trong lớp, bạn có thể thay đổi hành vi của chú vịt này bất cứ khi nào bạn muốn.

0

Tôi không phải là chuyên gia thiết kế, nhưng khi đọc cuốn sách đó, cảm giác đầu tiên tôi có về chương đó là giao diện được xây dựng và triển khai, vi phạm nguyên tắc lập trình : the Interface Segregation Principle (ISP) về cơ bản tình trạng nguyên tắc này mà

không có khách hàng nên buộc phải phụ thuộc vào phương pháp nó không sử dụng

Bởi vì một số Vịt không bay thực hiện bay() phương pháp thậm chí nó họ không cần nó. Điều đó nói rằng, trong trường hợp này, không thể tránh khỏi việc thực hiện tất cả các phương thức giao diện vì phía khách hàng chúng ta đang sử dụng các hành vi đa hình, và chúng ta cần đảm bảo rằng chúng ta có tất cả các phương thức có sẵn ngay cả khi không sử dụng.

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