Mercurial > docs > DesignPatterns
comparison detailed-observer.tex @ 36:f03413250b39 Ausarbeitung final
some typos and cleanups
author | meillo@marmaro.de |
---|---|
date | Sat, 11 Aug 2007 22:42:24 +0200 |
parents | 05f432307ba2 |
children |
comparison
equal
deleted
inserted
replaced
35:05f432307ba2 | 36:f03413250b39 |
---|---|
290 Wer den ersten Teil der Ausarbeitung verstanden hat und UML kann, sollte hier keine Probleme haben die Diagramme zu verstehen --- es ist quasi das Gleiche, nur in einer anderen Darstellungsform. | 290 Wer den ersten Teil der Ausarbeitung verstanden hat und UML kann, sollte hier keine Probleme haben die Diagramme zu verstehen --- es ist quasi das Gleiche, nur in einer anderen Darstellungsform. |
291 | 291 |
292 | 292 |
293 | 293 |
294 | 294 |
295 % Daten aus der Beschreibung des Observers von GoF | |
296 % in welche Gruppen wird er eingeordnet | |
297 \subsubsection{Klassifizierung nach GoF} | 295 \subsubsection{Klassifizierung nach GoF} |
298 | 296 |
299 Die ``Gang of Four'' (sie formulierten die ersten Design-Patterns für die Informatik) habe ein einheitliches Schema zu ihrer Klassifizierung erstellt. Anhand diesem ist der Observer folgendermaßen einzuordnen: | 297 Die ``Gang of Four'' (sie formulierten die ersten Design-Patterns für die Informatik) habe ein einheitliches Schema zu ihrer Klassifizierung erstellt. Anhand diesem ist der Observer folgendermaßen einzuordnen: |
300 | 298 |
301 \paragraph{Klassifizierung} | 299 \paragraph{Klassifizierung:} |
302 Verhaltensmuster, objektbasierend | 300 Verhaltensmuster, objektbasierend |
303 | 301 |
304 | 302 |
305 \paragraph{Auch bekannt als} | 303 \paragraph{Auch bekannt als:} |
306 Publish-Subscribe, Dependents | 304 Publish-Subscribe, Dependents |
307 | 305 |
308 | 306 |
309 \paragraph{Zweck} | 307 \paragraph{Zweck:} |
310 Abhängigkeiten zwischen Objekten erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert. | 308 Abhängigkeiten zwischen Objekten erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert. |
311 % todo: besser formulieren | 309 |
312 | 310 |
313 | 311 \paragraph{Kurzbeschreibung:} |
314 \paragraph{Kurzbeschreibung} | |
315 Schnittstellen anlegen, damit Abhängigkeiten zwischen Objekten registriert | 312 Schnittstellen anlegen, damit Abhängigkeiten zwischen Objekten registriert |
316 werden können, und um die abhängigen Objekte über Zustandsänderungen zu | 313 werden können, und um die abhängigen Objekte über Zustandsänderungen zu |
317 informieren. | 314 informieren. |
318 % todo: Formulierung überdenken | |
319 | 315 |
320 | 316 |
321 | 317 |
322 | 318 |
323 | 319 |
324 \subsection{Beispiele für den Observer in der Praxis} | 320 \subsection{Beispiele für den Observer in der Praxis} |
325 % Einsatzgebiete (MVC) und RL (Mailingslisten, Ebay-Suchabo) | |
326 % nicht aber (Blog + RSS) | |
327 | 321 |
328 Wo ist das Observer-Pattern nun im täglichen Leben anzutreffen? Natürlich ist hier das Leben in der digitalen Welt gemeint, schließlich geht es uns ja um ein Design-Pattern für die Programmierung. | 322 Wo ist das Observer-Pattern nun im täglichen Leben anzutreffen? Natürlich ist hier das Leben in der digitalen Welt gemeint, schließlich geht es uns ja um ein Design-Pattern für die Programmierung. |
329 | 323 |
330 Zuerst einmal ist anzuführen, dass der Observer ein sehr verbreitetes Design-Pattern ist, das recht häufig bei passenden Problemstellungen eingesetzt wird. | 324 Zuerst einmal ist anzuführen, dass der Observer ein sehr verbreitetes Design-Pattern ist, das recht häufig bei passenden Problemstellungen eingesetzt wird. |
331 | 325 |
341 | 335 |
342 | 336 |
343 | 337 |
344 | 338 |
345 | 339 |
346 %\subsection{Erweiterungen} | |
347 %% Erweiterungen, verbleibende Probleme, Kompromisse beim Design | |
348 \subsection{Erweiterungen des Patterns} | 340 \subsection{Erweiterungen des Patterns} |
349 | 341 |
350 \subsubsection{Ein Observer und mehrere Subjects} | 342 \subsubsection{Ein Observer und mehrere Subjects} |
351 Oft ist es nicht nur ein einziges Subject, das beobachtet werden soll. Damit ein Observer mehrere Subjects beobachten kann, muss er den Namen des Subjects mitsenden. So kann festgestellt werden welches Subject betroffen ist. | 343 Oft ist es nicht nur ein einziges Subject, das beobachtet werden soll. Damit ein Observer mehrere Subjects beobachten kann, muss er den Namen des Subjects mitsenden. So kann festgestellt werden welches Subject betroffen ist. |
352 | 344 |
353 | 345 |
354 \subsubsection{Nur für bestimmte Informationen anmelden} | 346 \subsubsection{Nur für bestimmte Informationen anmelden} |
355 Eine weitere kleine Erweiterung ist die Anmeldung am Subject für nur bestimmte Informationen. Dies ist sicher auch eine Ergänzung die unsere Pinnwand verbesser hätte. So wäre es dann möglich gewesen sich nur für Zimmerangebote oder ähnliches anzumelden. So werden auch die unnötigen Updates verringert, was positiv auf die Performance wirken kann. | 347 Eine weitere kleine Erweiterung ist die Anmeldung am Subject für nur bestimmte Informationen. Dies ist sicher auch eine Ergänzung die unsere Pinnwand verbessert hätte. So wäre es dann möglich gewesen sich nur für Zimmerangebote oder ähnliches anzumelden. Auf diese Weise werden auch die unnötigen Updates verringert, was sich positiv auf die Performance auswirken kann. |
356 | 348 |
357 | 349 |
358 \subsubsection{ChangeManager} | 350 \subsubsection{ChangeManager} |
359 Bei komplexen Update-Zusammenhängen ist es empfehlenswert einen ChangeManager zwischen die verschiedenen Subjects und Observers zu stellen. Dieser vermittelt dann zwischen den Beteiligten und koordiniert die Update-Vorgänge. Der ChangeManager ist eine Instanz vom Mediator-Pattern und üblicherweise Singleton, da normalerweise nur einer für alle Observer-Beziehungen verwendet wird. | 351 Bei komplexen Update-Zusammenhängen ist es empfehlenswert einen ChangeManager zwischen die verschiedenen Subjects und Observers zu stellen. Dieser vermittelt dann unter den Beteiligten und koordiniert die Update-Vorgänge. Der ChangeManager ist eine Instanz vom Mediator-Pattern und üblicherweise Singleton, da normalerweise nur ein ChangeManager für alle Observer-Beziehungen verwendet wird. |
360 | 352 |
361 | 353 |
362 \subsubsection{Wer ruft notify() auf?} | 354 \subsubsection{Wer ruft notify() auf?} |
363 Dies kommt stark auf das Programm an. Beide Alternativen haben ihre Vor- und Nachteile: | 355 Dies kommt stark auf das Programm an. Beide Alternativen haben ihre Vor- und Nachteile. |
364 | 356 |
365 \paragraph{Das Subject} | 357 \paragraph{Das Subject:} |
366 Auf diese Weise wird notify() sicher bei jedem setState() aufgerufen, jedoch können die Update-Kosten bei vielen Änderungen in kurzer Zeit sehr hoch werden. | 358 Auf diese Weise wird notify() sicher bei jedem setState() aufgerufen, jedoch können die Update-Kosten bei vielen Änderungen in kurzer Zeit sehr hoch werden. |
367 %\begin{itemize} | 359 |
368 % \item[+] notify() wird sicher bei jedem setState() aufgerufen | 360 |
369 % \item[-] hohe Update-Kosten bei Änderungen en-block | 361 \paragraph{Der Observer:} |
370 %\end{itemize} | |
371 | |
372 | |
373 \paragraph{Der Observer} | |
374 Hier darf nun der Observer den Aufruf von notify() nicht vergessen, dieser kann jedoch zu einem günstigen Zeitpunkt erfolgen, was sich bei Änderungen en-block positiv auswirkt. | 362 Hier darf nun der Observer den Aufruf von notify() nicht vergessen, dieser kann jedoch zu einem günstigen Zeitpunkt erfolgen, was sich bei Änderungen en-block positiv auswirkt. |
375 %\begin{itemize} | |
376 % \item[+] intelligenter Zeitpunkt des notify()-Aufrufs möglich | |
377 % \item[-] der Client darf den notify()-Aufruf nicht vergessen | |
378 %\end{itemize} | |
379 | |
380 | |
381 | |
382 | 363 |
383 | 364 |
384 | 365 |
385 | 366 |
386 | 367 |
391 | 372 |
392 \newpage | 373 \newpage |
393 | 374 |
394 \section{Zusammenfassung} | 375 \section{Zusammenfassung} |
395 | 376 |
396 Ich habe in meiner Ausarbeitung bisher ganz bewusst auf Quellcode verzichtet, denn ich wollte Design Pattern einmal von der anderen Seite her erklären. Ich wollte vermitteln weshalb das Observer-Pattern so aufgebaut ist wie es ist. Ich wollte Verständnis für Design Patterns entwickeln und zeigen, dass sie absolut logische Lösungen sind. | 377 Ich habe in meiner Ausarbeitung bisher ganz bewusst auf Quellcode verzichtet, denn ich wollte Design Patterns einmal von der anderen Seite her erklären. Ich wollte vermitteln weshalb das Observer-Pattern so aufgebaut ist wie es ist. Ich wollte Verständnis für Design Patterns entwickeln und zeigen, dass sie absolut logische Lösungen sind. |
397 | 378 |
398 \paragraph{In drei Sätzen:} | 379 \paragraph{In drei Sätzen:} |
399 \begin{itemize} | 380 \begin{itemize} |
400 \item Menschen denken basierend auf der Realität | 381 \item Menschen denken basierend auf der Realität |
401 \item deshalb Design Patterns auf Realität zurückführen | 382 \item deshalb Design Patterns auf die Realität zurückführen |
402 \item Patterns anwenden weil man es in der Realität auch so machen würde | 383 \item Patterns anwenden weil man es in der Realität auch so machen würde |
403 \end{itemize} | 384 \end{itemize} |
404 | 385 |
405 | 386 |
406 Design Patterns sind dabei Modelle wie Quellcode aufgebaut werden sollte. Sie sind kein Code --- sie beschreiben nur wie Code sein sollte. Das ist auch ganz gut so, denn: | 387 Design Patterns sind dabei Modelle wie Quellcode aufgebaut werden sollte. Sie sind kein Code --- sie beschreiben nur wie Code sein sollte. Das ist auch ganz gut so, denn: |