2012-06-23 35 views
0

Passenger s和Taxi s在不同的線程中獨立運行。經過Edwin Buck的大力幫助here我使用MVC進行出租車管理。在我的情況下(JTaxiPanel)和模型(Passenger)收聽Taxi。當Taxi發生事件(例如,當乘客被添加或出租車開始駕駛時),所有聽衆都會收到通知。問題是即使其他乘客被添加到出租車上也會通知Passenger。我希望乘客聽,但我不認爲應該在其他乘客被添加或在其他一些情況下通知Passenger如果視圖和模型(對象)都應該偵聽模型(對象),如何處理偵聽器?

如何處理這類問題?

出租車是否應該有2個聽衆列表或有其他方法可以做到這一點?

class Station extends Thread 
{ 
    LinkedList<Taxi> taxisInQueue; 
    LinkedList<Passenger> passengersInQueue; 
    void matchPassengerToTaxi() 
    { 
     Taxi taxi = taxisInQueue.removeFirst(); 
     Passenger passenger = passengersInQueue.removeFirst(); 
     // passenger listen to taxi 
     taxi.addListener(passenger); 
     taxi.addPassenger(passenger);  
    } 
} 
class Passenger extends Thread implements TaxiListener 
{ 
    @Override 
    public void taxiChanged(TaxiEvent event) 
    { 

    } 
} 
class Taxi extends Thread 
{ 
    Vector<Passenger> passengers; 
    public void addPassenger(Passenger passenger) 
    { 
     passengers.add(passenger);    
     // notify listeneres 
     fireEvent(new PassengerAddedEvent(this, passenger)); 
    }  
} 
class JTaxiPanel extends JPanel implements TaxiListener 
{ 
    public JTaxi(Taxi model) 
    { 
     this.model = model 
     // view listens to Taxi 
     model.addTaxiListener(this); 
    } 
    @Override 
    public void taxiChanged(TaxiEvent event) 
    {   
    } 
} 

回答

0

概括你說的話:event/listener是一個廣播通信模式。如果你建立了一個系統,許多聽衆忽略了大多數廣播,你就要求性能問題並增加聽衆的複雜度。

要解決這個問題,請選擇不同的通信通道,以不同類型的通信的不同事件和偵聽器類型實現。在這種情況下,不是指出現「出租車事件」的單一事件類型,而是找到出租車發生的不同類別的事件,並且具有較小的聽衆集合。

經驗法則是,最常發生的事件應忽略忽略它們的聽衆數量最少。另一個經驗法則是讓這些不同類型的事件相互排斥。您不希望同一個實體被通知兩次相同事件的情況。

在GUI系統中經常使用的另一種方法是事件掩碼。當安裝偵聽器時,將包含所需事件類型的掩碼。這可以讓發件人(在這種情況下爲出租車)避免發送給不感興趣的聽衆。

+0

如果我理解正確,你基本上建議使用至少2套監聽器,比如'viewListeners'和'modelListeners'?但是這會將'view'耦合到'model',是嗎? – theateist

+0

你能幫我嗎? – theateist

+0

不得不查看和模型監聽器。相反,模型組件向不同的偵聽器集發送不同的消息類型。對於你的問題,你沒有充分說明好例子。對於你提供的情況,你可以有一個「SinglePassengerNotify」事件/聽衆列表,當乘客進入或離開時,只有該乘客被通知。您還可以通過「AllPassengerInTaxiNotify」活動/聽衆名單通知乘客出租車已損壞等。 – Gene

0

您可以在您的乘客聽衆是否已經添加乘客是一樣的this。比較ID或其他平等標準。如果他們不一樣,他們什麼也不做......

相關問題