Listing 1: Command-Entwurfsmuster, klassische Variante // Aufrufer function Schaltflaeche(command) { this.command = command; this.click = function() { command.ausfuehren(); } } // Empfänger function VideoPlayer() { this.einschalten = function() { console.log("einschalten"); } this.ausschalten = function() { console.log("ausschalten"); } } // Commands var Command = function(empfaenger) { this.empfaenger = empfaenger; }; Command.prototype.ausfuehren = function() {}; var EinschaltenCommand = function(empfaenger) { Command.call(this, empfaenger); }; EinschaltenCommand.prototype = Object.create(Command.prototype); EinschaltenCommand.prototype.ausfuehren = function() { this.empfaenger.einschalten(); } var AusschaltenCommand = function(empfaenger) { Command.call(this, empfaenger); }; AusschaltenCommand.prototype = Object.create(Command.prototype); AusschaltenCommand.prototype.ausfuehren = function() { this.empfaenger.ausschalten(); } // Client var videoPlayer = new VideoPlayer(); // Instanzen der Commands var einschaltenCommand = new EinschaltenCommand(videoPlayer); var ausschaltenCommand = new AusschaltenCommand(videoPlayer); var schaltflaecheEin = new Schaltflaeche(einschaltenCommand); var schaltflaecheAus = new Schaltflaeche(ausschaltenCommand); schaltflaecheEin.click(); schaltflaecheAus.click(); Listing 2: Command-Entwurfsmuster mit funktionaler Unterstützung // Aufrufer function Schaltflaeche(command) { this.click = command; } // Empfänger function VideoPlayer() { this.einschalten = function() { console.log("einschalten"); } this.ausschalten = function() { console.log("ausschalten"); } } // Client var videoPlayer = new VideoPlayer(); // Die Commands sind Funktionen var einschaltenCommand = function(empfaenger) { return function() { empfaenger.einschalten(); } } var ausschaltenCommand = function(empfaenger) { return function() { empfaenger.ausschalten(); } } var schaltflaecheEin = new Schaltflaeche(einschaltenCommand(videoPlayer)); var schaltflaecheAus = new Schaltflaeche(ausschaltenCommand(videoPlayer)); schaltflaecheEin.click(); schaltflaecheAus.click(); Listing 3: Ohne Nutzung des Command-Entwurfsmusters // Aufrufer function Schaltflaeche(command) { this.click = command; } // Empfänger function VideoPlayer() { this.einschalten = function() { console.log("einschalten"); } this.ausschalten = function() { console.log("ausschalten"); } } // Client var videoPlayer = new VideoPlayer(); var schaltflaecheEin = new Schaltflaeche(videoPlayer.einschalten); var schaltflaecheAus = new Schaltflaeche(videoPlayer.ausschalten); schaltflaecheEin.click(); schaltflaecheAus.click(); Listing 4: Comparator-Interface in Java List zahlen = Arrays.asList(4, 5, 8, 3, 4, 2, 9, 4, 5); Comparator zahlenComparator = new Comparator() { public int compare(Integer zahl1, Integer zahl2) { // aufsteigende Sortierung return zahl1.compareTo(zahl2); } }; Collections.sort(zahlen, zahlenComparator); System.out.println(zahlen); Listing 5: Strategy-Entwurfsmuster in JavaScript var Comparator = function() {}; Comparator.prototype.compare = function(wert1, wert2) {}; var AbsteigendComparator = function() {}; AbsteigendComparator.prototype = Object.create(Comparator.prototype); AbsteigendComparator.prototype.compare = function(wert1, wert2) { return wert1 < wert2; } var AufsteigendComparator = function() {}; AufsteigendComparator.prototype = Object.create(Comparator.prototype); AufsteigendComparator.prototype.compare = function(wert1, wert2) { return wert1 > wert2; } var absteigendComparator = new AbsteigendComparator(); var aufsteigendComparator = new AufsteigendComparator(); var array = [4, 5, 8, 3, 4, 2, 9, 4, 5]; array.sort(absteigendComparator.compare); console.log(array); array.sort(aufsteigendComparator.compare); console.log(array); Listing 6: Strategy-Entwurfsmuster mit funktionaler Unterstützung var array = [4, 5, 8, 3, 4, 2, 9, 4, 5]; var absteigendeSortierung = function(wert1, wert2) { return wert1 < wert2; }; var aufsteigendeSortierung = function(wert1, wert2) { return wert1 > wert2; }; array.sort(absteigendeSortierung); console.log(array); array.sort(aufsteigendeSortierung); console.log(array); Listing 7: Singleton-Entwurfsmuster mit Lazy Instantiation var singleton = ( function () { var instance; function init() { var zufallsZahl = Math.random(); return { getZufallsZahl: function() { return zufallsZahl; } }; }; return { getInstance: function () { if(!instance) { instance = init(); } return instance; } }; })(); Listing 8: Lazy Instantiation via Self-Overwriting Function var singleton = ( function () { return { getInstance: function () { // Die Instanz wird nur einmal initialisiert var instance = new function(){ var zufallsZahl = Math.random(); return { getZufallsZahl : function() { return zufallsZahl; } } } // Neudefinition der Funktion this.getInstance = function() { return instance; } return this.getInstance(); } }; })(); Listing 9: Prototypische Aspekte von JavaScript var wuerfel = { breite : 20, tiefe : 20, hoehe : 20, farbe : 'weiß', setBreite : function(breite) { this.breite = breite; }, getBreite : function() { return this.breite; }, setTiefe : function(tiefe) { this.tiefe = tiefe; }, getTiefe : function() { return this.tiefe; }, setHoehe : function(hoehe) { this.hoehe = hoehe; }, getHoehe : function() { return this.hoehe; }, setFarbe : function(farbe) { this.farbe = farbe; }, getFarbe : function() { return this.farbe; } } var gelberWuerfel = Object.create(wuerfel); gelberWuerfel.setFarbe('gelb'); var blauerWuerfel = Object.create(wuerfel); blauerWuerfel.setFarbe('blau'); console.log(wuerfel.getFarbe()); // weiß console.log(gelberWuerfel.getFarbe()); // gelb console.log(blauerWuerfel.getFarbe()); // blau console.log(gelberWuerfel.getBreite()); // 20 console.log(blauerWuerfel.getBreite()); // 20 wuerfel.setBreite(40); console.log(gelberWuerfel.getBreite()); // 40 console.log(blauerWuerfel.getBreite()); // 40 gelberWuerfel.setBreite(60); console.log(gelberWuerfel.getBreite()); // 60 console.log(blauerWuerfel.getBreite()); // 40