Pauschale Aussagen sind immer schwierig, weil es natürlich von der jeweiligen Anwendung abhängt.
Nehmen wir als Beispiel mal die klassische Adressverwaltung. Nach dem Aufruf der Anwendung können Adressbücher angelegt, in den Adressbüchern die Kontakte verwaltet werden usw.
Es kann sein, dass jedes Adressbuch als Datei gespeichert wird. Es kann sein, dass alle Adressbücher in einer relationalen DB gespeichert werden. Es könnte auch sein, dass alles im Hauptspeicher gehalten wird (für Tests). Das ist für die Funktionsweise der Anwendung selbst aber (vom Prinzip her) irrelevant, weshalb so etwas als Implementierungsdetail zählt.
Man kann so etwas - wieder - über Schnittstellen entkoppeln. Zum Beispiel:
[code=Java]
interface AddressBookRepository {
void add(AddressBook book);
void remove(AddressBook book);
void update(AddressBook book);
List<AddressBook> findAll();
}
[/code]
Gegen diese Schnittstelle kann Dein Model dann arbeiten:
[code=Java]
public void createAddressBook(String name) {
getRepository().add(new AddressBook(name));
}
[/code]
Der Controller kann dann aufrufen:
[code=Java]
@FXML
public void handleAddAction(ActionEvent e) {
model.createAddressBook(addressBookName.getText());
}
[/code]
Für Tests (oder um die Entwicklung anderer Teile erstmal fertig zu bekommen) kann das Model beispielsweise einfach eine Implementierung von AddressBookRepository erhalten, die die Adressbücher in einer ArrayList verwaltet. Später tauscht man das durch DB-Implementierungen aus usw. Oder man bindet einen Cloud-Dienst an.
Natürlich ist das alles nur schemenhaft dargestellt.