Mach dich in diesem Zusammenhang mit Listenern vertraut. Die wirst du hier gebrauchen.
Im Model bastelst du am Besten eine Methode, die die Events abfeuert. Der Controller registriert die jeweiligen Views für das Event.
Beispiel:

Interface:
Code (Java):
public interface DoSomethingListener
{
  void onDoSomething(Object sender);
}

Model:
Code (Java):
public class ModelClass
{
  List<DoSomethingListener> listener = new ArrayList<DoSomethingListener>();
 
  public void addDoSomethingListener(DoSomethingListener listener)
  {
    this.listener.add(listener);
  }
 
  private doSomething()
  {
    for (DoSomethingListener listener : this.listener)
    {
      listener.onDoSomething(this);
    }
  }
  ...
}

View:
Code (Java):
public class ViewClass implements DoSomethingListener
{
  public void onDoSomething(Object sender)
  {
    // Code, der von der View ausgeführt wird
  }
}

Controller:
Code (Java):
public class ControllerClass
{
  ModelClass model = new ModelClass();
  ViewClass view = new ViewClass();
 
  public void initialize()
  {
    this.model.addDoSomethingListener(this.view);
  }


Wenn jetzt in der ModelClass irgendwo doSomething() aufgerufen wird, werden alle registrierten Listener abgearbeitet.
Auf diese Weise ist das Model komplett unabhängig von der View. Die View kann jetzt nun alles Mögliche sein. Von Textausgaben auf dem Bildschirm oder Datei, bishin zu komplexen Grafiken. Das Model bekommt davon nichts mit. Mein Beispiel ist aber sehr rudimentär gehalten und soll auch nur die Arbeitsweise verdeutlichen. Es wäre auch noch besser, würde man noch Nebenläufigkeiten berücksichtigen und abfragen gegen null machen.