<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Model-View-Presenter_%28MVP%29</id>
	<title>Model-View-Presenter (MVP) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Model-View-Presenter_%28MVP%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Model-View-Presenter_(MVP)&amp;action=history"/>
	<updated>2026-08-25T10:58:41Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Model-View-Presenter_(MVP)&amp;diff=88&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= Model-View-Presenter (MVP) Entwurfsmuster =  Das &#039;&#039;&#039;Model-View-Presenter&#039;&#039;&#039;-Muster (kurz: &#039;&#039;&#039;MVP&#039;&#039;&#039;) ist ein Architekturmuster, das aus dem MVC-Muster hervorgegangen ist.   Es wird häufig in &#039;&#039;&#039;grafischen Benutzeroberflächen (GUI)&#039;&#039;&#039; eingesetzt, um eine **klare Trennung zwischen Darstellung, Logik und Daten** zu erreichen und die Testbarkeit des Codes zu verbessern.  == Grundidee ==  Wie beim MVC-Muster b…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Model-View-Presenter_(MVP)&amp;diff=88&amp;oldid=prev"/>
		<updated>2025-11-01T11:42:17Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Model-View-Presenter (MVP) Entwurfsmuster =  Das &amp;#039;&amp;#039;&amp;#039;Model-View-Presenter&amp;#039;&amp;#039;&amp;#039;-Muster (kurz: &amp;#039;&amp;#039;&amp;#039;MVP&amp;#039;&amp;#039;&amp;#039;) ist ein Architekturmuster, das aus dem &lt;a href=&quot;/index.php?title=Model-View-Controller_(MVC)_Entwurfsmuster&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Model-View-Controller (MVC) Entwurfsmuster (Seite nicht vorhanden)&quot;&gt;MVC-Muster&lt;/a&gt; hervorgegangen ist.   Es wird häufig in &amp;#039;&amp;#039;&amp;#039;grafischen Benutzeroberflächen (GUI)&amp;#039;&amp;#039;&amp;#039; eingesetzt, um eine **klare Trennung zwischen Darstellung, Logik und Daten** zu erreichen und die Testbarkeit des Codes zu verbessern.  == Grundidee ==  Wie beim MVC-Muster b…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Model-View-Presenter (MVP) Entwurfsmuster =&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Model-View-Presenter&amp;#039;&amp;#039;&amp;#039;-Muster (kurz: &amp;#039;&amp;#039;&amp;#039;MVP&amp;#039;&amp;#039;&amp;#039;) ist ein Architekturmuster, das aus dem [[Model-View-Controller (MVC) Entwurfsmuster|MVC-Muster]] hervorgegangen ist.  &lt;br /&gt;
Es wird häufig in &amp;#039;&amp;#039;&amp;#039;grafischen Benutzeroberflächen (GUI)&amp;#039;&amp;#039;&amp;#039; eingesetzt, um eine **klare Trennung zwischen Darstellung, Logik und Daten** zu erreichen und die Testbarkeit des Codes zu verbessern.&lt;br /&gt;
&lt;br /&gt;
== Grundidee ==&lt;br /&gt;
&lt;br /&gt;
Wie beim MVC-Muster besteht die Anwendung aus drei Hauptkomponenten:  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Model&amp;#039;&amp;#039;&amp;#039; – enthält die Daten und Geschäftslogik,  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;View&amp;#039;&amp;#039;&amp;#039; – ist für die Darstellung und Benutzereingaben zuständig,  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Presenter&amp;#039;&amp;#039;&amp;#039; – vermittelt zwischen View und Model.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu MVC kommuniziert die View **nicht direkt mit dem Model**, sondern **nur über den Presenter**.  &lt;br /&gt;
Der Presenter ist damit die zentrale Steuerkomponente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+--------------+         +--------------+         +--------------+&lt;br /&gt;
|    View      | &amp;lt;-----&amp;gt; |   Presenter  | &amp;lt;-----&amp;gt; |    Model     |&lt;br /&gt;
| (Anzeige)    |         | (Logik)      |         | (Daten)      |&lt;br /&gt;
+--------------+         +--------------+         +--------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komponenten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponente !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Model&amp;#039;&amp;#039;&amp;#039; || Enthält Datenstrukturen, Geschäftslogik und Regeln.  &lt;br /&gt;
Unabhängig von Darstellung oder Benutzerinteraktion.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;View&amp;#039;&amp;#039;&amp;#039; || Zeigt Daten an und nimmt Benutzereingaben entgegen.  &lt;br /&gt;
Delegiert alle Aktionen an den Presenter.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Presenter&amp;#039;&amp;#039;&amp;#039; || Vermittelt zwischen View und Model.  &lt;br /&gt;
Reagiert auf Eingaben, ruft Model-Methoden auf und aktualisiert die View.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
1. Die View zeigt Daten an und reagiert auf Benutzeraktionen (z. B. Klicks).  &lt;br /&gt;
2. Statt direkt das Model zu ändern, ruft sie Methoden des Presenters auf.  &lt;br /&gt;
3. Der Presenter verarbeitet die Eingabe, ändert das Model und fordert die View zur Aktualisierung auf.  &lt;br /&gt;
4. Das Model kennt die View nicht – die Kommunikation läuft nur über den Presenter.&lt;br /&gt;
&lt;br /&gt;
== Beispiel (C++ Pseudocode) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// --- Model ---&lt;br /&gt;
class UserModel {&lt;br /&gt;
    std::string name;&lt;br /&gt;
public:&lt;br /&gt;
    void setName(const std::string&amp;amp; newName) { name = newName; }&lt;br /&gt;
    std::string getName() const { return name; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// --- View Interface ---&lt;br /&gt;
class IUserView {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void displayUser(const std::string&amp;amp; name) = 0;&lt;br /&gt;
    virtual ~IUserView() = default;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// --- Presenter ---&lt;br /&gt;
class UserPresenter {&lt;br /&gt;
    IUserView&amp;amp; view;&lt;br /&gt;
    UserModel&amp;amp; model;&lt;br /&gt;
public:&lt;br /&gt;
    UserPresenter(IUserView&amp;amp; v, UserModel&amp;amp; m) : view(v), model(m) {}&lt;br /&gt;
&lt;br /&gt;
    void onUserInput(const std::string&amp;amp; input) {&lt;br /&gt;
        model.setName(input);&lt;br /&gt;
        view.displayUser(model.getName());&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// --- Concrete View ---&lt;br /&gt;
class ConsoleUserView : public IUserView {&lt;br /&gt;
public:&lt;br /&gt;
    void displayUser(const std::string&amp;amp; name) override {&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Benutzername: &amp;quot; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// --- main ---&lt;br /&gt;
int main() {&lt;br /&gt;
    UserModel model;&lt;br /&gt;
    ConsoleUserView view;&lt;br /&gt;
    UserPresenter presenter(view, model);&lt;br /&gt;
&lt;br /&gt;
    presenter.onUserInput(&amp;quot;Alice&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Ausgabe:**&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Benutzername: Alice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu MVC ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! MVC !! MVP&lt;br /&gt;
|-&lt;br /&gt;
| Kommunikation || View ↔ Controller ↔ Model || View ↔ Presenter ↔ Model&lt;br /&gt;
|-&lt;br /&gt;
| Verbindung Model–View || Möglich || Strikt getrennt&lt;br /&gt;
|-&lt;br /&gt;
| Hauptsteuerung || Controller || Presenter&lt;br /&gt;
|-&lt;br /&gt;
| Datenfluss || Teilweise bidirektional || Meist Presenter-gesteuert&lt;br /&gt;
|-&lt;br /&gt;
| Testbarkeit || Gut || Sehr gut (Presenter leicht isolierbar)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Varianten ==&lt;br /&gt;
* **Passive View:**  &lt;br /&gt;
  Die View ist vollständig passiv – sie enthält keine Logik und wird ausschließlich durch den Presenter aktualisiert.  &lt;br /&gt;
  → Vorteil: hohe Testbarkeit.  &lt;br /&gt;
* **Supervising Controller:**  &lt;br /&gt;
  Die View kann einfache Datenbindungen selbst verwalten, während komplexe Logik im Presenter bleibt.  &lt;br /&gt;
  → Kompromiss zwischen Einfachheit und Flexibilität.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* Strikte Trennung zwischen Logik und Darstellung  &lt;br /&gt;
* Hohe Wiederverwendbarkeit und Testbarkeit (Presenter kann ohne UI getestet werden)  &lt;br /&gt;
* Keine direkte Abhängigkeit der View vom Model  &lt;br /&gt;
* Gut geeignet für GUI-Frameworks mit klaren Schnittstellen (z. B. Android, Qt, WinForms)&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Mehr Boilerplate-Code durch Interfaces und Zwischenschichten  &lt;br /&gt;
* Erhöhter Kommunikationsaufwand zwischen Komponenten  &lt;br /&gt;
* Bei zu viel Logik im Presenter kann dieser überladen werden&lt;br /&gt;
&lt;br /&gt;
== Typische Einsatzgebiete ==&lt;br /&gt;
* GUI-Anwendungen (Desktop oder Mobile)&lt;br /&gt;
* Systeme mit klarer Trennung von Frontend- und Logikschicht&lt;br /&gt;
* Anwendungen mit Fokus auf Unit-Testing und Mock-Views  &lt;br /&gt;
  (z. B. Android-Apps mit Test-Frameworks)&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit ähnlichen Mustern ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Muster !! Hauptidee !! Kommunikation&lt;br /&gt;
|-&lt;br /&gt;
| [[Model-View-Controller (MVC) Entwurfsmuster]] || Controller reagiert auf Benutzeraktionen || View ↔ Controller ↔ Model&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Model-View-Presenter (MVP)&amp;#039;&amp;#039;&amp;#039; || Presenter verwaltet Logik und Aktualisierung der View || View ↔ Presenter ↔ Model&lt;br /&gt;
|-&lt;br /&gt;
| [[Model-View-ViewModel (MVVM) Entwurfsmuster]] || View ist über Datenbindung an ViewModel gekoppelt || View ⇄ ViewModel ⇄ Model&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispielhafte Frameworks ==&lt;br /&gt;
* **Android:** Activity/Fragment als View, Presenter als Logik (z. B. mit „Moxy“ oder „Mosby“ Frameworks)&lt;br /&gt;
* **WinForms / WPF (C#):** Presenter als Vermittler zwischen GUI und Datenmodell&lt;br /&gt;
* **Qt (C++):** Presenter kann zwischen QML-View und C++-Backend vermitteln&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Model-View-Controller (MVC) Entwurfsmuster]]&lt;br /&gt;
* [[Model-View-ViewModel (MVVM) Entwurfsmuster]]&lt;br /&gt;
* [[Presentation-Abstraction-Control (PAC) Muster]]&lt;br /&gt;
* [[Event-Driven Architecture]]&lt;br /&gt;
* [[Entwurfsmuster (Softwareentwicklung)]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* Martin Fowler: *GUI Architectures* (2006)  &lt;br /&gt;
* Erich Gamma et al.: *Design Patterns – Elements of Reusable Object-Oriented Software*  &lt;br /&gt;
* [https://martinfowler.com/eaaDev/uiArchs.html Martin Fowler: UI Architectures]  &lt;br /&gt;
* [https://en.wikipedia.org/wiki/Model–view–presenter Wikipedia: Model–View–Presenter]  &lt;br /&gt;
* [https://refactoring.guru/design-patterns/mvp Refactoring.Guru: MVP Pattern]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>