所以我是MVC的新手,我正在创建与其他类有1:N关系的Model类,例如
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
?
答案 0 :(得分:2)
模型,在您的情况下Post
必须提供视图需要显示的所有内容,即帖子应该包含其注释的集合。
你现在设计它的方式你需要两个模型和两个视图,一个用于帖子,一个用于帖子的评论。或者至少有两个模型和一个视图,但您仍然需要单独查询
实际上,如果你有两个观点,你的设计才有意义,一个用于帖子,一个用于评论。
答案 1 :(得分: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);
}