Java Design Pattern

4.225 Aufrufe

Veröffentlicht am

A detailed overview ;) of design paterns

I highly recommend the O'Reilly book "Head First Design Pattern" for more information!

Veröffentlicht in: Technologie
1 Kommentar
1 Gefällt mir
Statistik
Notizen
  • Excellent presentation, never saw such a interactive & rich presentation on design patterns. Understood most part, if it was in English it would have been more better. Iis there any way you could translate explanation in English and post a new one? I like German, some day i would try to learn it, but for now I know Hindi, Telugu, Tamil, English languages only.
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
Keine Downloads
Aufrufe
Aufrufe insgesamt
4.225
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
4
Aktionen
Geteilt
0
Downloads
0
Kommentare
1
Gefällt mir
1
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • Musterkataloge
  • Vorteile Auslösender und Ausführender sind entkoppelt. Befehlsobjekte können wie andere Objekte auch manipuliert werden. (Verändern, Filtern, Zwischenspeichern, ... ) Befehlsobjekte können zu komplexen Befehlen kombiniert werden ( Makros , realisiert als Kompositum ) Nachteile Es wird für jedes Kommando eine neue Klasse benötigt. Dies kann sehr schnell zu einer großen Menge von Klassen führen. Beispiel Ein gutes Beispiel für das Befehlsmuster, ist die Verknüpfung von GUI -Elementen, wie Schaltflächen oder Menüpunkten , mit den entsprechenden Aktionen: Konkrete Befehle realisieren dann Aktionen wie Datei öffnen , Rückgängig oder Schreibmarke nach rechts Klienten sind die Applikation oder Dialoge. Aufrufer sind Schaltflächen, Menüpunkte oder Hotkeys . Empfänger sind die Applikation ( Datei öffnen ) oder das Dokument ( Rückgängig , Einfügemarke nach rechts )
  • Java Design Pattern

    1. 1. Design Pattern Teil 2 Ein etwas strukturierterer Ansatz http://flickr.com/photos/kingdesmond/477389196/
    2. 3. Design Pattern
    3. 4. Creational Pattern http://flickr.com/photos/factoryjoe/204497604/
    4. 5. Structural Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational
    5. 6. Behavioral Pattern http://flickr.com/photos/factoryjoe/204497604/ Creational Structural
    6. 7. http://flickr.com/photos/urbanwoodswalker/2578030316/
    7. 8. Basis-Pattern
    8. 9. Grundlegendes <ul><li>Basiswissen OOP </li></ul><ul><ul><li>Normale Klasse </li></ul></ul><ul><ul><li>Abstrakte Klasse </li></ul></ul><ul><ul><li>Interface </li></ul></ul>
    9. 10. Grundlegendes <ul><li>Basiswissen OOP </li></ul><ul><ul><li>Normale Klasse </li></ul></ul><ul><ul><li>Abstrakte Klasse </li></ul></ul><ul><ul><li>Interface </li></ul></ul><ul><li>Beziehungen </li></ul><ul><ul><li>Is-A (Inheritance) </li></ul></ul><ul><ul><li>Has-A (Composition) </li></ul></ul><ul><ul><li>Can-Do (Interfaces) </li></ul></ul>
    10. 11. Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
    11. 12. Vererbung Ente quaken() schwimmen() anzeigen() fliegen() StockEnte anzeigen() MoorEnte anzeigen() GummiEnte anzeigen() quaken()
    12. 13. Interfaces Ente schwimmen() anzeigen() StockEnte anzeigen() fliegen() quaken() MoorEnte anzeigen() fliegen() quaken() GummiEnte anzeigen() quaken() QuakFähig quaken() FlugFähig fliegen() LockEnte anzeigen()
    13. 14. Komposition FliegtMitFlügel fliegen() FliegtGarNicht fliegen() Quaken quaken() QuakVerhalten quaken() Quietschen quaken() StummesQuaken quaken() FlugVerhalten fliegen()
    14. 15. Komposition GummiEnte MoorEnte Ente FlugVerhalten flugVerhalten QuakVerhalten quakVerhalten schwimmen() anzeigen() quakVerhalten = new Quaken() flugVerhalten = new FliegtMitFlügel() quakVerhalten = new Quietschen() flugVerhalten = new FliegtGarNicht()
    15. 16. http://flickr.com/photos/leecullivan/500201058/
    16. 17. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung
    17. 18. Observer Subjekt Beobachter
    18. 19. Observer Subjekt Beobachter Registriere mich
    19. 20. Observer Subjekt Beobachter
    20. 21. Observer Observable addObserver() deleteObserver() notifyObservers() Sender getNachricht() <<InterFace>> Observer Update() Empfänger Update(); Anzeigen(); Empfänger Update(); Anzeigen();
    21. 22. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung
    22. 23. Decorator preis() preis() preis() preis()
    23. 24. Decorator Getränk Beschreibung getBeschreibung() Preis() Hausmischung Preis() Espresso Preis() ZutatDekorierer getBeschreibung() Milch Getränk getränk Preis() getBeschreibung() Schokolade Getränk getränk Preis() getBeschreibung()
    24. 25. public class Schokolade { //…. private double preis() { return 0.40 + getraenk.preis; } //… } Decorator
    25. 26. Decorator Ausgabe: „Kakao + Schokolade + Milch + Schokolade“ Ausgabe: „Kakao + DoppelSchokolade + Milch“
    26. 27. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein.
    27. 28. Factory
    28. 29. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() TeurerChickenBurger
    29. 30. <ul><li>bestelleBurger() </li></ul><ul><li>{ </li></ul><ul><li>Burger burger; </li></ul><ul><li>if(aktionsZeitraum) </li></ul><ul><li>burger = new AktionsChickenBurger(); </li></ul><ul><li>else </li></ul><ul><li>burger = new TeurerChickenBurger(); </li></ul><ul><li>burger.grillen(); </li></ul><ul><li>burger.einpacken(); </li></ul><ul><li>return burger; </li></ul><ul><li>} </li></ul>erstelleBurger()
    30. 31. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger
    31. 32. Factory Method Burger AktionsChickenBurger McPlusCity bestelleBurger() erstelleBurger() TeurerChickenBurger McFiliale bestelleBurger() reinigeFiliale()
    32. 33. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Erweiterungen offen, aber für Veränderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen
    33. 34. Abstract Factory
    34. 36. Abstract Factory
    35. 37. Singleton <ul><li>Singleton </li></ul><ul><li>Instance : Singleton </li></ul><ul><li>Singleton() </li></ul><ul><li>+ getInstance(): Singleton </li></ul>
    36. 38. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   }
    37. 39. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   } Verzögerte Instantiierung
    38. 40. Singleton public class Singleton { private static SingleTon einzigeInstanz;   private Singleton () {}   public static synchronized Singleton getInstanz () { if (einzigeInstanz == null) { einzigeInstanz = new Singleton (); } return einzigeInstanz; }   }
    39. 41. Problem Multithreading public class Singleton { private static SingleTon einzigeInstanz = new Singleton();   private Singleton () {}   public static synchronized Singleton getInstanz () { return einzigeInstanz; }   } Verzögert  Vorzeitig
    40. 42. Problem Multithreading Zweifach geprüftes Sperren public class Singleton { private volatile static SingleTon einzigeInstanz;   private Singleton () {}   public static Singleton getInstanz () { if ( einzigeInstanz == null) { synchronized ( Singleton.class ) { if ( einzigeInstanz == null) { einzigeInstanz = new Singleton (); } } return einzigeInstanz; }   }
    41. 43. Pattern in freier Wildbahn J2EE
    42. 44. J2EE-Beispiele <ul><li>Decorator </li></ul><ul><ul><li>new BufferedReader (new InputStreamReader ( System . in )); </li></ul></ul><ul><li>Session Facade </li></ul><ul><li>Data Access Object </li></ul>
    43. 45. J2EE-Musterkatalog [SUN]
    44. 46. Zusammengesetze Muster
    45. 47. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken()
    46. 48. public class EntenSimulator { //…. void simulieren() { Quakfähig stockEnte = new StockEnte(); Quakfähig lockPfeife = new LockPfeife(); Quakfähig gummiEnte = new GummiEnte(); simulieren(stockEnte); simulieren(lockPfeife); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
    47. 49. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() Gans schnattern()
    48. 50. public class GansAdapter implements Quakfähig { Gans gans; //…. public void quaken() { gans.schnattern(); } //… }
    49. 51. StockEnte quaken() QuakFähig quaken() LockPfeife quaken() GummiEnte quaken() GansAdapter quaken()
    50. 52. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new GummiEnte(); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
    51. 53. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new GummiEnte(); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
    52. 54. public class Quakzähler implements Quakfähig { Quakfähig ente; int anzahlDerQuaks; //…. public void quaken() { //…. ente.quaken(); anzahlDerQuaks++; } //… }
    53. 55. public class EntenSimulator { //…. void simulieren() { //…. Quakfähig gummiEnte = new QuakZähler(new StockEnte()); Quakfähig gansEnte= new GansAdapter(new Gans()); simulieren(stockEnte); simulieren(gansEnte); } void simulieren (Quakfähig ente) { ente.quaken(); } //… }
    54. 56. Adapter + Decorator + Abstract Factory
    55. 57. Adapter + Decorator + Abstract Factory + Composite
    56. 58. public class Schar implements Quakfähig { ArrayList quakende = new ArrayList () public void hinzufügen( Quakfähig quaker) { quakende.add(quaker); } public void quaken() { Iterator iterator = quakende.iterator(); while( iterator.hasNext() ) { Quakfähig quaker = ( Quakfähig )iterator.next(); quaker.quaken(); } } //… }
    57. 59. Adapter + Decorator + Abstract Factory + Composite + Iterator + Observer
    58. 60. Musterkataloge http://flickr.com/photos/northbaywanderer/121971249/
    59. 61. Design Pattern <ul><li>Wiederverwendbarkeit </li></ul><ul><ul><li>Entkoppeln / Trennen </li></ul></ul><ul><ul><li>Vereinfachen / Aufteilen </li></ul></ul>
    60. 63. ZUGABE? <ul><li>Noch mehr Pattern… </li></ul>
    61. 64. Command
    62. 65. Command http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster)
    63. 66. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden
    64. 67. Adapter <ul><li>Zwischenschalten einer Schicht </li></ul><ul><li>Um Schnittstelle so anzupassen, dass sie ohne änderung übernommen werden kann </li></ul>
    65. 68. Facade <ul><li>Schnittstelle Vereinfachen / Schützen </li></ul><ul><li>Weitere Funktion für Validierung, etc. </li></ul><ul><li>Kommt in OptimalJ vor </li></ul><ul><li>Gleicher Aufbau wie Adapter </li></ul>
    66. 69. Template <ul><li>Algorithmus </li></ul><ul><li>Hooks </li></ul>
    67. 70. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an
    68. 71. Iterator <ul><li>Unabhängigkeit von der jeweiligen Collection-Implementierung </li></ul>
    69. 72. Composite <ul><li>Durchlaufen von “Bäumen” </li></ul><ul><li>Rekursives Aufrufen </li></ul>
    70. 73. State <ul><li>Zustandsabhänige Elemente werden extrahiert </li></ul>
    71. 74. MOTORRAD <ul><li>Beispiel </li></ul>http://flickr.com/photos/neilw/192737187/
    72. 75. Kapseln Sie das, was variiert Ziehen Sie die Komposition der Vererbung vor Programmieren Sie auf eine Schnittstelle, nicht auf eine Implementierung Streben Sie für Objekte, die interagieren, nach Entwürfen mit lockerer Bindung Klassen sollten für Ertweiterungen offen, aber für Verönderung geschlossen sein. Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen Sprechen Sie nur mit Ihren Freunden Versuchen Sie nicht uns anzurufen, wir rufen Sie an Eine Klasse sollte nur einen Grund haben, sich zu ändern
    73. 76. Proxy <ul><li>Zwischenschalten einer Schicht </li></ul><ul><li>Aufbau gleich wie Adapter </li></ul><ul><li>Zweck unterschiedlich </li></ul>
    74. 77. YES WE
    75. 78. Quellenverzeichnis <ul><li>[SUN] Alur, Crupi, Malks: core J2EE Patterns. Sun Microsystems Press; Prentice Hall; 2001. (deutsche Übersetzung von Frank Langenau; Markt+Technik Verlag; 2002.) </li></ul>

    ×