如果视图和模型(对象)都应该侦听模型(对象),java如何处理侦听器?
Passenger
和Taxi
在不同的线程中独立运行。在Edwin Buck的大力帮助下,我使用MVC进行出租车管理。在我的情况下,视图(JTaxiPanel
)和模型(Passenger
)都听Taxi
。当Taxi
触发事件时(例如,当增加乘客或出租车开始驾驶时…)通知所有听众。问题是Passenger
即使出租车上增加了其他乘客,也会收到通知。我想让乘客听我说,但我不认为Passenger
应该在添加其他乘客或在其他情况下得到通知
如何处理这种问题
出租车应该有两个听众列表,还是有其他方法
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)
{
}
}
# 1 楼答案
概括一下你的意思:事件/听众是一种广播传播模式。如果您构建的系统中有许多侦听器忽略了大多数广播,那么您就是在询问性能问题,并增加侦听器的复杂性
要解决这个问题,请为不同类型的通信选择实现为不同事件和侦听器类型的不同通信通道。在本例中,不是一个单一的事件类型,即“出租车发生了什么事”,而是查找发生在出租车上且侦听器集较小的不同类别的事件
经验法则是,最频繁发生的事件应该有最少的听众忽略它们
另一个经验法则是使这些不同类型的事件相互排斥。您不希望同一实体收到同一事件的两次通知
GUI系统中经常使用的另一种方法是事件掩码。安装侦听器时,会包含所需事件类型的掩码。这让发送者(在本例中是出租车)避免发送给不感兴趣的听众
# 2 楼答案
如果添加的乘客与
this
相同,您可以在乘客侦听器中进行检查。比较ID或其他一些平等标准。如果他们不一样,他们什么都不做