ビューごとに複数のコメントを含む 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);
}