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、ビューが表示する必要があるすべてのものを持ってくる必要があります。つまり、投稿はそのコメントのコレクションを保持する必要があります。

ここで設計した方法では、2 つのモデルと 2 つのビュー (1 つは投稿用、もう 1 つは投稿へのコメント用) が必要になります。または、少なくとも 2 つのモデルと 1 つのビューが必要ですが、両方を個別にクエリする必要があります

実際、あなたのデザインは、投稿用とコメント用の 2 つのビューがある場合にのみ意味があります。

于 2013-11-08T13:58:17.640 に答える
1

ビューごとに複数のコメントを含む 1 つの投稿があると仮定すると、モデルに投稿とそのすべてのコメントが含まれるように設定する必要があります。ビューは、投稿の表示方法を決定します。そうすれば、異なるレイアウトが必要な場合に、同じモデルに対して複数のビューを持つことができます。各ビューは投稿を異なる方法で表示することを決定できますが、モデルを変更する必要はありません。

コントローラーは、ビューとモデルの間のすべてのアクションを処理します。ビューでモデルを直接変更しないでください。代わりに、ビューは、ユーザーが基になるデータと対話する方法を定義し、それをコントローラーに渡します。コントローラーはモデルを変更します。そうすれば、同じモデルを持つ 2 つのビューがある場合、それらは独立して動作し、同じ更新を取得できます。

私はすべてのモデルにこのクラスを拡張させたいと思っています。リスナーのコードを毎回書く必要がなくなるだけです。

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 に答える