2012-10-14 26 views
9

Lớp Invoker có phải là tùy chọn trong mẫu thiết kế Command không? Khách hàng cần khởi tạo Lệnh và Bộ thu bê tông cho lệnh. Khách hàng có cần phải khởi tạo Invoker và truyền đối tượng lệnh cho đối tượng Invoker không. Sau đó, bất cứ khi nào client cần thực hiện lệnh, client chỉ yêu cầu đối tượng Invoker và Invoker thực hiện lệnh (có thể ngay lập tức hoặc có thể xếp hàng lệnh để thực thi sau này).Mẫu thiết kế lệnh - Là Invoker tùy chọn?

Hay đây có phải là cách khác không? Nếu khách hàng cần thực hiện lệnh đồng bộ, máy khách sẽ tham chiếu lệnh bằng cách sử dụng giao diện lớp cơ sở nhưng sẽ khởi tạo lệnh và bộ thu cụ thể. Bất cứ khi nào khách hàng sẽ cần thực hiện lệnh, client sẽ chỉ gọi phương thức execute trên biến của lớp cơ sở? Khi có nhu cầu về một số logic bổ sung khi lệnh được thực hiện, lớp Invoker sẽ được sử dụng để giữ cho logic bổ sung đó và máy khách sẽ tương tác với đối tượng Invoker để thực hiện lệnh?

Trả lời

6

Mục đích của mẫu lệnh thường là 1) Tạo một tập hợp các hoạt động khác nhau chia sẻ cùng một loại để chúng có thể được xử lý bằng cùng mã 2) hoạt động marshalling/tạo riêng từ lời gọi hoạt động. Người nhận được yêu cầu rõ ràng cho mục đích 2.

Nếu bạn gọi ngay sau khi tạo hoặc nếu Người nhận đang đóng vai trò của người gọi, thì không có người độc thân, độc lập. Cho dù điều đó có nghĩa là không có người gọi thực sự là một câu hỏi triết học :)

Hãy nhìn theo cách này: Bạn/có thể/tách riêng việc tạo, lên lịch và gọi. Điều đó không có nghĩa là bạn phải thực hiện chúng như ba lớp riêng biệt. Nó chỉ là những vai trò hợp lý có liên quan đến vòng đời của mô hình Lệnh.

EDIT: Tôi đoán nguyên tắc trách nhiệm duy nhất cho rằng bạn nên tách chúng ra, nhưng có một điều như ý nghĩa của commen :) Điều kiện địa phương có thể và cần được quan sát.

1

Như chúng ta đã biết, java.lang.Runnable là một trong các ví dụ về mẫu lệnh trong đó lớp Thread hoạt động như một trình invoker. Chúng ta truyền đối tượng của lớp Runnable đến lớp Thread và bắt đầu/chạy.

Nhưng chúng tôi không bao giờ tạo lớp khách hàng có thể gọi chủ đề chính.

Vì vậy, người gọi không phải là tùy chọn nhưng không được kết hợp chặt chẽ với khách hàng. Vì vậy, UML của mẫu lệnh không bao giờ hiển thị bất kỳ mối quan hệ nào giữa lớp máy khách và lớp invoker.

Một số khác answer liên quan đến câu hỏi này.