2012-02-11 19 views
12

Tên (và javadocs) ngụ ý rằng MouseAdapter là một bộ điều hợp (mẫu thiết kế). Nhưng tôi không thấy nó như vậy - nó không thích nghi bất cứ điều gì với bất cứ điều gì, ngay từ cái nhìn đầu tiên ít nhấtTại sao MouseAdapter lại là bộ điều hợp?

Sự thích nghi duy nhất xảy ra là bạn có thể chuyển một thể hiện của MouseAdapter sang bất kỳ phương pháp nào mong đợi một trong hai giao diện. Vì vậy, bạn có thể sử dụng trường hợp MouseListener chỉ trong đó MouseMotionListener được mong đợi. Nhưng không có "dịch" xảy ra. Và nó không phù hợp với UML của GoF - trong phiên bản "class adapter", người ta dự kiến ​​rằng một cuộc gọi đến một phương thức sẽ gọi một phương thức từ adaptee.

Vậy, đó có phải là bộ điều hợp (mẫu thiết kế) hay chỉ là một tên ngẫu nhiên gây nhầm lẫn?

Trả lời

12

MouseAdapter xuất hiện lần đầu trong Java 1.1 phát hành trong Feb 1997. Điều này có nghĩa là nó được phát triển vào năm 1996 (hoặc 1995?)

UML (trong bản nháp) là completed by 1997.

Cuốn sách GoF đầu tiên về các mẫu thiết kế là published in 1995.

Vì vậy, tôi không nghĩ rằng Bộ chuyển đổi trong MouseAdapter có liên quan đến mẫu thiết kế tương ứng. Hoặc, ngay cả khi nó đã làm, các nhà phát triển chỉ không có ngôn ngữ thống nhất để thể hiện các mẫu thiết kế mà sẽ làm cho nó rất khó để hiểu ý nghĩa thực sự.

5

Có, nó không phải là bộ điều hợp theo ý nghĩa của mô hình GoF vì nó không thích ứng với bất kỳ thứ gì. Nó có thể được coi là một thể hiện của lớp trừu tượng mô hình [woolf97]:

Các lớp cha có thể cung cấp một cài đặt hoàn chỉnh đó là một mặc định hoặc tối thiểu thực hiện.

1

Như câu trả lời khác đã nói, đó không phải là mẫu Bộ điều hợp GoF. Mục đích chính của nó là để cho phép thực hiện MouseListener (hoặc MouseMotionListener) bằng cách chỉ cưỡi các phương pháp mong muốn trong MouseAdapter (thường chỉ mouseClicked()) thay vì phải tạo ra các triển khai rỗng vô nghĩa của tất cả các phương pháp khác. Do đó, nó tiết kiệm rất nhiều mã không cần thiết, đặc biệt là khi sử dụng trình nghe sự kiện ẩn danh. Ví dụ (lấy từ here)

someObject.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      ...//Event listener implementation goes here... 
     } 
    }); 
0

Tôi biết có đã là một câu trả lời chấp nhận cho câu hỏi này, nhưng câu hỏi này cùng được hỏi ở đây:

MouseAdapter: which pattern does it use?

Xem có để biết thêm deatils, nhưng MouseAdapter điều chỉnh giao diện MouseListener rất lộng lẫy thành một dạng dễ sử dụng hơn.

+0

Vấn đề với lý do này là, như các câu trả lời khác cho thấy, không có sẵn các adapter trong tình huống MouseAdapter. Động lực của GoF Adapter (Tôi trích dẫn cuốn sách GoF) là "Đôi khi một lớp bộ công cụ được thiết kế để tái sử dụng không thể tái sử dụng chỉ vì giao diện của nó không khớp với giao diện miền cụ thể mà ứng dụng yêu cầu". MouseAdapter là một * bộ chuyển đổi * vì nó có thể dễ dàng được điều chỉnh (tùy chỉnh) để nắm bắt các sự kiện chuột. Bộ điều hợp GoF cho biết bạn có một số * lớp kế thừa * (bộ công cụ) mà bạn không thể thay đổi, do đó bạn thích nghi với giao diện của nó đối với nhu cầu của ứng dụng của bạn. – Fuhrmanator

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