2011-01-06 25 views
5

Lần đầu tiên đăng một câu hỏi về StackOverflow, vì vậy hãy đi dễ dàng trên tôi :)tách Xem từ điều khiển trong Java MVC Pattern

Từ những gì tôi hiểu, sử dụng hợp lý các mô hình MVC đòi hỏi chúng ta tách khung nhìn và bộ điều khiển sao cho khung nhìn không biết gì về bộ điều khiển. Tôi đang gặp một chút vấn đề khi hiểu cách thực hiện điều này bằng cách sử dụng Java Swing.

Giả sử tôi có chế độ xem (một số lớp sẽ mở rộng JFrame) và chế độ xem này có nút. Có an toàn không khi nói rằng tôi muốn đăng ký bộ điều khiển dưới dạng ActionListener của nút? Hay tôi làm cho nó trở thành một người nghe của toàn bộ khung nhìn.

Và làm cách nào để đi về việc này mà không làm một cái gì đó như:

button.addActionListener (MyController)

trong giao diện, bởi vì nếu tôi được làm điều này trong mã xem, sẽ không nó bây giờ có một sự phụ thuộc vào bộ điều khiển?

Tôi không đăng bất kỳ mã nào bởi vì, thật lòng tôi không có nhiều thứ để tiếp tục vào lúc này.

mọi trợ giúp đều được ứng dụng!

+0

liên kết đến câu hỏi có liên quan trên stackoverflow: http://stackoverflow.com/questions/3066590/gui-problem-after-rewriting-to-mvc.Vấn đề chính của tôi với MVC là có rất nhiều cách để làm điều đó, và tôi đã nhận ra rằng quan điểm và bộ điều khiển thường được kết hợp chặt chẽ, do đó, nó thực sự là lập trình để quyết định cách thức anh ta muốn giải quyết các phụ thuộc. Cảm ơn sự phản hồi của bạn! – Alan

Trả lời

4

Có thể giúp bạn không nghĩ về chế độ xem về các nút, v.v ... nhiều như giao diện. Giao diện làm cho nó có thể cho web ui của, bàn giao tiếp dòng lệnh, vv để được viết và thực hiện vai trò của xem.

Trong trường hợp sự kiện nút của bạn, nút biểu thị cuộc gọi đến một số lệnh do bộ điều khiển thực hiện.

Vì vậy, bạn có thể có một giao diện như thế này:

public interface MyViewIf { 
    // used by the controller to register its self as a listener of the view 
    public addViewListener(ViewListener vl); 
    ... 
} 

và:

public interface ViewListenerIf { 
    // used by the View to notify any listeners of control events etc. 
    public onViewEvent(ViewEvent ve); 
} 

Sau đó điều khiển của bạn sẽ thực hiện ViewListenerIf và đăng ký nó tự với một nhà máy tạo ra thể hiện của MyViewIf. Bằng cách đó, bộ điều khiển không cần biết bất kỳ chi tiết cụ thể nào về lớp xem của bạn.

Lớp xem của bạn sau đó sẽ xử lý nội bộ các sự kiện nút riêng của nó, biến chúng thành các đối tượng ViewEvent và gọi onViewEvent() trên bộ điều khiển đã tự đăng ký với chế độ xem, để Chế độ xem 100% không biết đến sự tồn tại của Bộ điều khiển.

+0

Một bình luận nhanh hơn - bạn cũng có thể thay thế các phương thức addViewListener và onViewEvent bằng một loạt các phương thức addXXXEventListener cụ thể hơn và các đối tượng sự kiện tương ứng vv Đôi khi không thuận tiện để thử và tổng quát tất cả các sự kiện Xem thành một đối tượng duy nhất. – Nick

+0

Cảm ơn! Điều này chắc chắn là theo dõi những gì tôi đang tìm kiếm. Bạn có thể xây dựng một chút về các đối tượng ViewEvent không. Đây có phải là cái gì tôi sẽ phải mã lên bản thân mình, hoặc là có các lớp học có liên quan trong các thư viện java swing mà tôi có thể mở rộng ..? Tôi đã đọc trên swing trong java hướng dẫn, vì vậy nếu tôi đã bỏ lỡ một lời giải thích ở nơi khác, bạn chỉ có thể chỉ cho tôi đi đúng hướng :) – Alan

+0

Theo như những gì để sử dụng cho lớp sự kiện của bạn, nó có thể khá nhiều bất kỳ lớp nào nhưng tôi đã tìm thấy nó nhanh nhất để tự viết chúng vì chúng có xu hướng là các đối tượng rất đơn giản với các trường ứng dụng cụ thể. Ví dụ, nếu khung nhìn của bạn chỉ cần truyền các thông điệp chứ không phải các chuỗi, mảng, vv đối tượng ViewEvent của bạn có thể bao gồm một trường int hoặc enum đại diện cho messageId. – Nick

1

Hãy xem qua số Spring Framework để biết thông tin chi tiết về cách triển khai mẫu MVC. Hướng dẫn ngắn gọn về mùa xuân Tutorial

+0

Cảm ơn bạn đã liên kết. Tôi sẽ xem xét nó. – Alan

1

Tạo một trình xử lý tác vụ trong lớp chế độ xem của bạn. Từ trình xử lý tác vụ của bạn, bạn gọi bộ điều khiển của mình.

Mã cho ActionListener:

controller.doButtonClick(); 

này có nghĩa là bạn cần phải tiêm mô hình và điều khiển của bạn để xem. Đó là cách tôi làm điều đó.

+0

Điều này không giới thiệu sự phụ thuộc vào bộ điều khiển từ khung nhìn? Nếu vậy, điều này có chấp nhận được trong mẫu MVC không? Và nếu không, làm thế nào, vì chúng tôi đang thực sự đề cập đến các bộ điều khiển từ xem, chỉ gián tiếp thông qua các hành động viên? – Alan

+1

Có. Nhưng tôi nghĩ là không sao. Chúng tôi sử dụng mẫu mvc để tách riêng ui khỏi logic miền. Nếu bạn định tạo một ui mới thì nó vẫn chỉ là mã xem mà bạn phải thay đổi. –

+1

Những gì bạn có thể làm, là từ cuộc gọi điều khiển của bạn: getView(). GetButton(). AddActionListener (myControllerButtonActionListener); nếu bạn thích điều đó tốt hơn. Điều này không giới thiệu một sự phụ thuộc vào bộ điều khiển từ khung nhìn. –

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