5

Tại sao tôi cần sử dụng Chuỗi trách nhiệm, nếu tôi có thể tải tất cả lệnh vào một số vùng chứa và chỉ thực hiện từng lệnh một. Điều này sẽ làm cho một chuỗi xử lý một yêu cầu liên tiếp. BTW Tôi cảm thấy rằng nó tốt hơn CoR vì bạn có thể loại bỏ một số lệnh cụ thể hoặc thay thế bằng một lệnh khác trên thời gian chạy, trong khi đối với CoR, bạn cần tạo một chuỗi khác để thay đổi thứ gì đó trong chuỗi vì bạn không có quyền truy cập vào các phần tử trong chuỗi ngoại trừ phần tử đầu tiên. (Đó là, trên thực tế, một danh sách liên kết đơn.)Chuỗi trách nhiệm vs Lệnh trong hàng đợi hoặc ngăn xếp

Trả lời

1

Chỉ cần để "giữ cho nó đơn giản ngớ ngẩn" :-)

Tạo một danh sách/stack khi bạn đặc biệt cần đến nó, và bạn sẽ biết khi nào bạn cần nó phải không?

Đối example- nếu bạn phải làm một số thao tác dữ liệu đơn giản như:

data.clean().format().save(); 

vs

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

cũng nhận thấy, tôi đã phải viết mã hơn để tạo ra cấu trúc dữ liệu mới (lệnh ngăn xếp).

Nhưng hãy nói rằng đó là điều gì đó mang tính chiến lược hơn, ví dụ như trò chơi bắn súng. Người chơi có thể bị bắn, giết chết, vv, và kết quả phụ thuộc vào mức độ khó chọn của trò chơi.

headShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new KillPlayer()); 

bodyShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new LooseHealth()); 

player.onHit = function(hitPoint){ 
    hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this); 
}; 

Lưu ý trong trường hợp này, chúng tôi phải tạo một chiến lược có thể được truyền đi và xảy ra khi chạy.

Vì vậy, khi ở chế độ đơn giản, bodyShot có thể không có phần tử cuối cùng (LooseHealth) và headShot có thể có LooseHealth thay vì KillPlayer làm phần tử cuối cùng.

Hy vọng điều đó sẽ hữu ích.

+0

Điều nào đơn giản? COR hoặc ngăn xếp? Đối với tôi cả hai đều giống nhau sh * t. – Narek

+0

okay, xem câu trả lời đã chỉnh sửa ở trên – Nishant

+0

Bạn đã so sánh chồng với định dạng tĩnh 'data.clean().(). Save();'. Nhưng tôi đã yêu cầu stack vs COR, vì các thay đổi thời gian chạy có thể được thực hiện trong cả hai, như trong COR, bạn có thể tạo ra các chuỗi mới. – Narek

0

Tôi không nghĩ CoR yêu cầu danh sách được liên kết đơn lẻ. Đó có thể là một triển khai phổ biến; nhưng một danh sách được liên kết gấp đôi hoặc hầu như bất kỳ bộ sưu tập/vùng chứa nào khác có thể được sử dụng, miễn là nó tách riêng người gửi thư khỏi (các) người nhận thư. Những gì bạn mô tả âm thanh hoàn toàn tương thích với mẫu CoR. Bạn vừa tăng cường khả năng định cấu hình Chuỗi. Điều quan trọng cần lưu ý là các GoF definition dạy chúng ta để thực hiện các chuỗi,

mà không cần mối quan hệ xử lý cứng hệ thống dây điện và ưu tiên,

... nhưng tôi không nghĩ rằng nên hạn chế sự lựa chọn của chúng ta về bộ sưu tập cho các trình xử lý.


Cũng lưu ý rằng Chuỗi trách nhiệm không giống như chuỗi xử lý. Hàm sau ngụ ý các phép toán tuần tự (tức là một số pipeline) trong khi trước đây là phân cấp nhưng không nhất thiết phải tuần tự. Bất kỳ số nào và kết hợp các trình xử lý (hoặc không có số nào trong số chúng) có thể hành động theo một yêu cầu duy nhất.

Cuối cùng, tôi giả sử việc sử dụng từ "lệnh" trong câu hỏi là tham chiếu đến các trình xử lý trong Chuỗi và không tham chiếu đến số Command Pattern. Các mẫu CoR và Command có thể bổ sung về các yêu cầu đối với Chuỗi, nhưng theo truyền thống không phải là các lệnh như trình xử lý.

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