2

我正在尝试制作纸牌游戏。

我的一些课程是:CardModel、CardView;甲板模型,甲板视图。

卡片组模型有卡片模型列表,根据MVC,如果我想将卡片发送到卡片组,我可以将卡片模型添加到卡片组模型,卡片视图将通过事件添加到卡片组视图处理程序。

所以我在 DeckModel 类中有一个 addCard(CardModel m) ,但是如果我想发送一个事件将该模型的卡片视图添加到卡片组视图中,我只知道让模型具有对视图的引用。

那么问题来了:如果卡片模型和甲板模型都必须引用它们的视图类来做呢?如果没有,如何做得更好?

更新,代码:

public class DeckModel {
private ArrayList<CardModel> cards;

private ArrayList<EventHandler> actionEventHandlerList;

public void addCard(CardModel card){
    cards.add(card);

    //processEvent(event x);
    //must I pass a event that contain card view here?
}

CardModel getCards(int index){
    return cards.get(index);

}

public synchronized void addEventHandler(EventHandler l){
    if(actionEventHandlerList == null)
        actionEventHandlerList = new ArrayList<EventHandler>();

    if(!actionEventHandlerList.contains(l))
        actionEventHandlerList.add(l);
}

public synchronized void removeEventHandler(EventHandler l){
    if(actionEventHandlerList!= null && actionEventHandlerList.contains(l))
        actionEventHandlerList.remove(l);
}

private void processEvent(Event e){
    ArrayList list;

    synchronized(this){
        if(actionEventHandlerList!= null)
            list = (ArrayList)actionEventHandlerList.clone();
        else
            return;
    }
    for(int i=0; i<actionEventHandlerList.size(); ++i){
        actionEventHandlerList.get(i).handle(e);
    }
}
}
4

1 回答 1

1

在一个好的 MVC 模型中不应该知道 View。为此,您可以为您的模型提供控制器将订阅的侦听器接口。因此 Controller 可以在 Model 更改后更新 View。

在 JavaFX 中有下一个支持:ObservableList、属性和绑定。您可以看看它是如何在ListView中完成的:items属性是ObservableList由 ListView 控制器监控的,它会相应地更新视图。所以用户ListView什么都不知道,他们可以简单地添加/删除/更改items.

于 2012-09-09T07:52:09.840 回答