0

Passengers 和Taxis 在不同的线程中独立运行。在 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

如果已添加的乘客与 相同,您可以检查您的乘客侦听器this。比较 id 或其他一些平等标准。如果他们不一样,他们什么都不做......

于 2012-06-23T22:19:10.297 回答
0

概括您所说的:事件/侦听器是一种广播通信模式。如果您构建一个系统,其中许多侦听器忽略了大多数广播,那么您就是在要求性能问题并增加侦听器的复杂性。

要解决此问题,请为不同类型的通信选择实现为不同事件和侦听器类型的不同通信通道。在这种情况下,不是表示“出租车发生了某事”的单一事件类型,而是查找发生在出租车上并且具有较小侦听器集的不同类别的事件。

一个经验法则是,最频繁发生的事件应该有最少数量的侦听器忽略它们。

另一个经验法则是使这些不同类型的事件相互排斥。您不希望同一实体被两次通知同一事件的情况。

GUI 系统中经常使用的另一种方法是事件掩码。安装侦听器时,将包含所需事件类型的掩码。这让发送者(在本例中为出租车)避免发送给不感兴趣的听众。

于 2012-06-23T22:31:34.873 回答