2010-06-04 37 views
7

Tôi muốn triển khai thiết kế trong Java, nơi tôi có nhiều nguồn sự kiện (Chủ đề). Nguồn sự kiện như vậy thực hiện một nhiệm vụ cụ thể và phải thông báo cho Trình xử lý sự kiện (Class) duy nhất và điều này phải thực hiện các tác vụ khác theo các thông báo nguồn sự kiện.Java, Mẫu thiết kế: Nhiều nguồn sự kiện và Một trình xử lý sự kiện

Câu hỏi của tôi là: cách triển khai desiqn này theo cách thích hợp trong Java? Có một mẫu thiết kế tương tự như thiết kế này?

Cảm ơn bạn trước :).

+0

Lol @ answers: 3 mẫu khác nhau !!! – Pindatjuh

+0

Bạn có thể cho tôi một cái không ?? – Zakaria

+0

câu hỏi hay tôi sẽ chỉ sử dụng một khối đồng bộ trong một phương thức gọi lại của lớp xử lý – fasseg

Trả lời

3

Tôi nghĩ bạn đang tìm kiếm mẫu Observer. Java không có một số giao diện chuẩn (java.util.Observer, java.util.Observable), mặc dù đây không phải là loại cụ thể; vì vậy bạn có thể xem xét của riêng bạn nếu miền dường như yêu cầu nó.

class MyThread implements Runnable { 
Observable observable; 

public MyThread(EventHandler observer) { 
    observable = new Observable(); 
    observable.addObserver(observer); 
} 

public void run() { 
    while (!done()) { 
    Object result = doStuff(); 
    observable.notifyObservers(result); 
    } 
} 
} 

// might have this be singleton 
class EventHandler implements Observer { 
public synchronized void update(Observable o, Object arg) { 
    accomplishOtherTask(); 
} 
} 
+0

Cảm ơn Justin đã trả lời. Tôi đã thử giải pháp này, nhưng vấn đề nằm trong Threads (được coi là Observable) vì các chủ đề của tôi đã mở rộng từ một lớp khác, và nếu bạn muốn sử dụng Observable, bạn phải mở rộng nó và bạn biết nhiều thừa kế không được phép trong Java. Bạn có đề xuất nào không? – Zakaria

+0

Chủ đề của bạn có thể bao gồm một Observable hoặc bạn có thể có lớp cơ sở của bạn mở rộng Observable. Sử dụng runnable (thay vì mở rộng Thread) được ưa thích vì điều này trong số các lý do khác. – Justin

+0

Cảm ơn! Tôi hiểu ý tưởng của bạn và tôi đã triển khai nó. Nhưng tôi thực sự không hiểu mẫu mã của bạn: Đầu tiên chúng ta không thể thực hiện Quan sát được, chúng ta phải mở rộng nó. Có lẽ bạn có nghĩa là Observer. Nếu điều này đúng với mẫu mã của bạn là tốt. – Zakaria

0

Âm thanh như mẫu hình diễn viên với tôi. Mỗi luồng đóng vai trò là một diễn viên, hoàn thành một nhiệm vụ duy nhất. Th eoutcome được đặt trên hàng đợi (yes) để được xử lý bởi diễn viên tiếp theo.

Tôi chưa có kinh nghiệm về khung công tác diễn viên java. Tham khảo ý kiến ​​của Google về điều đó.

+0

Cảm ơn bạn Arjan Molenaar vì sự kính trọng của bạn. Tôi sẽ google cho khung công tác diễn xuất trong Java, bạn có thể cho tôi thêm giải thích không? – Zakaria

0

Trong GWT, đây được gọi là event bus. Hoặc là GWT. HandlerManager hoặc GWTx. PropertyChangeSupport là các triển khai được Google đề xuất. Sau này có sẵn trong J2SE kể từ 1.4.2

+0

Cảm ơn bạn đã phản hồi. Tôi có thể sử dụng các triển khai đó cho các sự kiện không phải GUI không? – Zakaria

+0

Một HandlerManager chỉ là một hàng đợi của các nhà quan sát. Khi một sự kiện được kích hoạt trên HandlerManager, người quản lý sẽ kiểm tra từng người quan sát nếu nó có thể phản hồi sự kiện. nếu nó có thể, sau đó người giám sát sẽ được gọi với các args thích hợp và như vậy. –

+0

Có, Zakaria, java.beans.PropertyChangeSupport có thể được sử dụng cho các sự kiện không phải GUI. – Glenn

0

Có lẽ tôi không hiểu câu hỏi của bạn, nhưng tôi nghĩ bạn không cần bất kỳ mẫu thiết kế nào, nhưng có gì đó từ gói java.util.concurrent.

Một ThreadPoolExecutor?

0

Mẫu quan sát không có ý kiến ​​về luồng. Trong EventThread pattern người nghe có thể nêu rõ chủ đề nào và khi nào sự kiện được xử lý.

public class MyObservableObject { 
    ... 
    void addListener(MyListener listener, Executor executor); 
} 
public interface MyListener { 
    void onEvent(Object sender, Object event); 
} 

// Example 
obj.addListener(myListener, CURRENT_THREAD); 
obj.addListener(myListener, myWorkQueue); 
obj.addListener(myListener, AWT_EDT); // or SWT_EDT 
obj.addListener(myListener, Executors.newSingleThreadScheduledExecutor()); 
Các vấn đề liên quan