2013-11-08 4 views
4

Так что я новичок в MVC и я создаю классы модели, которые имеют 1: N отношение с другими классами, напримерMVC один ко многим отношений в модели

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?

ответ

2

Модель, в вашем случае Post должна отображать все, что нужно отображать, т. Е. Сообщение должно содержать коллекцию его комментариев.

То, как вы его спроектировали, теперь вам понадобятся две модели и два вида, одна для публикации и одна для комментариев к сообщению. Или, по крайней мере, две модели и один вид, но вам все равно нужно запросить оба отдельно.

На самом деле ваш дизайн будет иметь смысл, если у вас есть два вида, один для сообщения и один для комментариев.

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); 
} 
Смежные вопросы