【问题标题】:How to handle listeners if both views and models(objects) should listen to model(object)?如果视图和模型(对象)都应该监听模型(对象),如何处理监听器?
【发布时间】:2012-06-24 06:31:34
【问题描述】:

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

【问题讨论】:

    标签: java model-view-controller architecture


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果我理解正确的话,你基本上建议至少使用2组监听器,比如viewListenersmodelListeners?但是这对viewmodel 的情侣,是吗?
    • No not view 和 model listeners。模型组件向不同的侦听器集发送的消息类型不同。你没有对你的问题说足够的好例子。对于您提供的案例,您可以有一个“SinglePassengerNotify”事件/侦听器列表,其中当乘客进入或离开时,仅通知该乘客。您还可以有一个“AllPassengerInTaxiNotify”事件/侦听器列表,用于通知乘客出租车发生故障等。
    • 您还需要了解什么?我以为我提供了所有必要的信息。请告诉我,我会提供
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2012-05-13
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多