Ein anschauliches Beispiel aus dem Real Life: Eine Musikdatei muss sich nicht selbst abspielen können, es ist sinnvoll, dass dies eine spezialisierte Verarbeitungsstation erledigt, damit nicht jede Musikdatei selbst den Code des Betriebssystems und alle Soundkartenschnittstellen kennen muss.
Ein anderes Beispiel:
(Graphics)g.draw(new Rectangle(...))
Das Rectangle selbst beinhaltet keine Zeichenlogik und das ist auch gut so.
Es erfüllt aber einen Interface-Standard (Shape), der von g gezeichnet werden kann.
Wie wäre es mit Zinsberechnung? Soll ein Bankkonto oder gar der aktuelle Kontostand in der Lage sein, Zinsen selbst auszurechnen? Auf die Idee würde keiner kommen und das zu Recht.
Das "sich selber zeichnen" habe ich jahrelang so praktiziert - bis das Ausgabeziel ein anderes wurde, dann ging der Schuss nach hinten los. Auch sollten die Elemente sich selbst anhand von Parametern verarbeiten, selbst dafür sorgen, dass die Zieldaten erzeugt wurden - das hat sich im Nachhinein ebenfalls als Fehler erwiesen.
Man verliert enorm viel Flexibilität, wenn komplexe Vorgänge innerhalb der Datenklassen passieren und das Ganze wird sehr schwer zu warten, die Schnittstellen werden zu unübersichtlich. Einfache Vorgänge, welche wirklich nur die Daten selbst betreffen, können natürlich rein. Aber die Verarbeitung der Daten - vor allem mit verschiedenen Zielen - sollte außerhalb passieren.