Khi thiết kế API cung cấp giao diện nghe sự kiện, có vẻ như có hai cách xử lý các cuộc gọi để thêm / xóa người nghe:
Nhiều cuộc gọi đến addListener sẽ chỉ thêm một người nghe (như thêm nó vào một tập hợp); có thể được loại bỏ bằng một lệnh gọi đến removeListener.
Nhiều cuộc gọi đến addListener sẽ thêm một người nghe mỗi lần (như thêm nó vào danh sách); phải được cân bằng bởi nhiều lệnh gọi đến removeListener.
Tôi đã tìm thấy một ví dụ về mỗi: (1) - Cuộc gọi DOM addEventListener trong trình duyệt chỉ thêm người nghe một lần, âm thầm bỏ qua các yêu cầu để thêm cùng một người nghe lần thứ hai và (2) - .on
Hành vi jQuery thêm người nghe nhiều lần .
Hầu hết các API người nghe khác dường như sử dụng (2), chẳng hạn như trình nghe sự kiện SWT và Swing. Nếu (1) được chọn, cũng có câu hỏi liệu nó có nên thất bại âm thầm hay có lỗi khi có yêu cầu thêm cùng một người nghe hai lần.
Trong các triển khai của mình, tôi có xu hướng gắn bó với (2) vì nó cung cấp giao diện loại thiết lập / phá vỡ sạch hơn và phát hiện ra các lỗi trong đó "thiết lập" vô tình được thực hiện hai lần và phù hợp với hầu hết các triển khai tôi đã thấy.
Điều này dẫn tôi đến câu hỏi của tôi - Có một kiến trúc cụ thể hoặc thiết kế cơ bản nào khác cho vay tốt hơn cho việc thực hiện khác không? (tức là: tại sao mô hình khác tồn tại?)
foo
== bar
, thì nó sẽ ghi đè lên, nếu không, nó sẽ có một foo
và một bar
là người nghe. Nếu nó luôn ghi đè, nó sẽ không phải là một tập hợp, mà là một đối tượng duy nhất đại diện cho một người quan sát.
addListener(foo); addListener(foo); addListener(bar);
. Có phải trường hợp số 1 của bạn thêm mộtfoo
và mộtbar
, hoặc chỉbar
(nghĩa làbar
ghi đè lênfoo
như người nghe)? Trong trường hợp # 2, sẽfoo
bắn hai lần, hoặc một lần?