0

PassengerTaxiは、異なるスレッドで独立して実行されます。ここで Edwin Buck の大きな助けを借りて、タクシー管理に MVC を使用しました。私の状況では、view( JTaxiPanel) と models()の両方が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)
    {        
    }
}
4

2 に答える 2

0

あなたが言っていることを一般化するには、イベント/リスナーはブロードキャスト通信パターンです。多くのリスナーがほとんどのブロードキャストを無視するシステムを構築すると、パフォーマンスの問題が発生し、リスナーが複雑になります。

これを修正するには、さまざまな種類の通信に対して、さまざまなイベントおよびリスナーの種類として実装されたさまざまな通信チャネルを選択します。この場合、「タクシーに何かが起こった」ことを意味する単一のイベント タイプではなく、タクシーに発生し、リスナー セットが小さいさまざまなクラスのイベントを見つけます。

経験則では、最も頻繁に発生するイベントには、それらを無視するリスナーの数が最も少ないはずです。

もう 1 つの経験則は、これらの異なるタイプのイベントを相互に排他的にすることです。同じエンティティに同じイベントが 2 回通知されることは望ましくありません。

GUI システムで頻繁に使用されるもう 1 つのアプローチは、イベント マスクです。リスナーがインストールされると、目的のイベント タイプのマスクが含まれます。これにより、送信者 (この場合はタクシー) は、関心のないリスナーに送信することを回避できます。

于 2012-06-23T22:31:34.873 に答える
0

追加されたパッセンジャーが と同じかどうか、パッセンジャー リスナーで確認できますthis。ID またはその他の同等基準の比較。それらが同じでなければ、彼らは何もしません...

于 2012-06-23T22:19:10.297 に答える