4

所以我是 MVC 的新手,我正在创建与其他类具有 1:N 关系的模型类,例如

public class Post {
    private int id;
    private String message;
    // setters and getters
}

public class Comment {
    private int id;
    private int postId;
    private String text;
    // setters and getters
}

我的问题是,MVC 标准是否说我需要List<Comment>在我的Post班级里有一个?

4

2 回答 2

2

在您的情况下,模型Post必须带来视图需要显示的所有内容,即帖子应该包含其评论的集合。

按照您现在的设计方式,您需要两个模型和两个视图,一个用于帖子,一个用于帖子的评论。或者至少有两个模型和一个视图,但仍然需要分别查询

实际上,只有当您有两种视图时,您的设计才有意义,一种用于帖子,另一种用于评论。

于 2013-11-08T13:58:17.640 回答
1

假设您将有一个帖子,每个视图都有多个评论,您应该设置它,以便模型包含帖子及其所有评论。然后视图将确定如何显示帖子。这样,如果您想拥有不同的布局,您可以为同一模型拥有多个视图。每个视图都可以决定以不同的方式显示帖子,但模型不需要更改。

控制器将处理视图和模型之间的任何操作。视图不应直接修改模型。相反,视图定义了用户如何与底层数据交互,将其传递给控制器​​,然后控制器修改模型。这样,如果您有两个具有相同模型的视图,它们可以独立运行并且仍然获得相同的更新。

我喜欢让我所有的模型都扩展这个类。它只是让我不必每次都为听众编写代码。

import javax.swing.event.EventListenerList;

/**
 * AbstractModel - Base class for a Model in a MVC pattern. This class contains
 * an EventListenerList to allow for notification of a view that it's model has
 * changed.
 */
public abstract class AbstractModel {

private final EventListenerList observers = new EventListenerList();

/**
 * Constructor
 */
protected AbstractModel() {
}

/**
 * Add a ModelChangeListener
 * 
 * @param listener
 */
public void addModelChangedListener(final ModelChangedListener listener) {
    observers.add(ModelChangedListener.class, listener);
}

/**
 * Notifies listeners that the model has changed. Use the event property
 * name to determine what has changed
 * 
 * @param event
 */
protected void fireModelChangedEvent(final ModelChangedEvent event) {
    for (final ModelChangedListener l : observers
            .getListeners(ModelChangedListener.class)) {
        l.modelChanged(event);
    }
}

/**
 * Remove a ModelChangeListener
 * 
 * @param listener
 */
public void removeModelChangedListener(final ModelChangedListener listener) {
    observers.remove(ModelChangedListener.class, listener);
}
}


import java.beans.PropertyChangeEvent;

/**
 * ModelChangedEvent - An event used when a view's model has changed.
 *
 */
public class ModelChangedEvent extends PropertyChangeEvent {

/**
 * Constructor
 * 
 * @param source
 * @param propertyName
 * @param oldValue
 * @param newValue
 */
public ModelChangedEvent(final Object source, final String propertyName,
        final Object oldValue, final Object newValue) {
    super(source, propertyName, oldValue, newValue);
}
}

import java.util.EventListener;

/**
 * Interface for classes interested in ModelChangedEvents. Intended to be used
 * by view classes in a MVC pattern.
 */
public interface ModelChangedListener extends EventListener {

    /**
     * Notifies this Listener that the model has changed.
     * 
     * @param event
     */
    public void modelChanged(ModelChangedEvent event);
}
于 2013-11-08T14:14:16.003 回答