Java 使用观察者模式在模型中抛出异常

Java 使用观察者模式在模型中抛出异常,java,exception,observer-pattern,Java,Exception,Observer Pattern,是否更可能使用Java中的observer模式来处理一些简单游戏中的游戏规则,或者只是在UserInterface类中向handel抛出异常 每次用户单击用户界面上的按钮时,该控制器仅将此操作委托给包含数据的模型。该模型决定数据与某些游戏规则相比是否正确,或者只是抛出异常以在控制器中处理该异常并对每个自定义异常作出反应。例如(在模型类中;不需要向您显示相应的控制器类): 具有PropertyChangeListener和PropertyChangeSupport的观察者模式: public vo

是否更可能使用Java中的observer模式来处理一些简单游戏中的游戏规则,或者只是在UserInterface类中向handel抛出异常

每次用户单击用户界面上的按钮时,该控制器仅将此操作委托给包含数据的模型。该模型决定数据与某些游戏规则相比是否正确,或者只是抛出异常以在控制器中处理该异常并对每个自定义异常作出反应。例如(在模型类中;不需要向您显示相应的控制器类):

具有PropertyChangeListener和PropertyChangeSupport的观察者模式:

public void setPlayerNames(ArrayList<String> playerNames) 
{
    if(playerNames.size() == 0)
       propertyChangeSupport.firePropertyChange("pleaseEnterAtLeastOnePlayerName);
    else
       startGame();
}
public void setPlayerNames(ArrayList playerNames)
{
如果(playerNames.size()==0)
propertyChangeSupport.firePropertyChange(“PleaseenTerateNetLayerName”);
其他的
startGame();
}
模型中有一些自定义的例外情况:

public void setPlayerNames(ArrayList<String> playerNames) throws NoPlayerException
{
    if(playerNames.size() == 0)
       throw new NoPlayerException();
    else
       startGame();
}
public void setPlayerNames(ArrayList playerNames)抛出NoPlayerException
{
如果(playerNames.size()==0)
抛出新的NoPlayerException();
其他的
startGame();
}

以下哪种方法更符合MVC范式?

第一种方法使用PropertyChangeListener触发与属性更改无关的事件。使用基于事件的模型来实现验证看起来不是很直观,也不容易使用


第二种方法抛出异常以表示非法参数。使用IllegalArgumentException是表示此类问题的最佳方法。但这样做只是为了防止模型进入无效状态,而不是为了实现验证。控制器应在将列表传递给模型之前检查其有效性。

Yes t他的观点是正确的,但是如果你编写一个简单的API来松散地将游戏逻辑与用户界面耦合起来,你该怎么做呢?问题是:如果有人实现了一个不同的GUI,并且想要输入不充分的数据,那么模型(逻辑)必须告诉GUI做什么。控制器位于UI级别,与逻辑无关,因此无法在控制器中检查数据是否正确。我学会了使用观察者模式,但使用异常处理是否正确?UI调用模型调用数据级别(GUI-->模型-->数据)。永远不要反过来。保护模型状态不受不正确GUI的影响,并引发有意义的异常不是问题。但这应该有助于GUI开发人员实现正确的验证。验证本身不应该是验证。例如,GUI可以国际化。模型不应该关心它。这是公司的工作controller处理i18n。其他示例:一些GUI可能需要HTML格式的错误消息,而另一个GUI可能需要纯文本错误消息,另一个GUI将禁用按钮,直到数据有效。模型不应处理这些差异。是的,但哪一个更好:在您的情况下,如果有一些非法案例?没有什么可以阻止您在模型中提供方法来检查数据是否有效。控制器应该简单地调用这些方法。不需要事件或异常。并且控制器必须知道游戏的逻辑。您不能在不了解扑克的情况下为扑克游戏实现GUI。as I说:模型应该通过在无效参数的情况下抛出异常来保持其不变量。你不应该简单地将GUI中的验证建立在这些异常的基础上。验证逻辑就像汽车中的制动器。你一直使用制动器来避免事故。模型抛出的异常就像安全气囊。它应该切勿使用,除非是为了防止驾驶员忘记使用制动器时出现严重问题。