<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>Design Pattern Facade by Tim Schuetzle</title>
      <link>https://padlet.com/schuetzlito/facade</link>
      <description>Alles zur Fassade</description>
      <language>en-us</language>
      <pubDate>2020-12-14 12:29:53 UTC</pubDate>
      <lastBuildDate>2023-02-15 00:41:46 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url></url>
      </image>
      <item>
         <title>Zweck</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1015594645</link>
         <description><![CDATA[<div>Stellt eine einheitliche Schnittstelle (Interface) für eine Menge von Schnittstellen des Subsystems zur Verfügung. Führt eine Strukturierungsebene oberhalb von Klassen ein. Ziel ist die Minimierung der Kopplung.<br>Durch die einheitliche Schnittstelle wird nicht nur die Komplexität versteckt (Hiding Complexity), sondern auch der Zugang beziehungsweise die Verwendung des Systems vereinfacht.<br><br>Um sich als User mit einem System, dass viele Klassen und Abhängigkeiten innehält, vertraut zu machen und die Funktionalität zu verstehen, bedarf es Zeit und spezifisches Wissen.<br>Die Facade dient als "Vermittler" zwischen Client und Subsystem.<br>Das schwer zu verstehende beziehungsweise komplexe Subsystem wird gekapselt. <br>Die Clientaufrufe werden über die Facade an das Subsystem deligiert und dort verarbeitet.<br>Somit benötigt der User/Client kein Verständnis oder Wissen des darunterliegenden Subsystems.<br><br>Des Weiteren wird das Subsystem beziehungsweise Teile davon austauschbar gemacht.<br>Die Facade beinhaltet optimalerweise keinerlei Abhängigkeiten. System- beziehungsweise Firmeninterne sind oft nicht vermeidbar, aber diese stehen nicht im Weg. <br>Wenn die eigentliche Problemstellung (z.B Berechnung von Feiertagen) mittels einer Abhängigkeit gelöst wird, dann findet sich diese lediglich im Subsystem. Sollte also die verwendete Bibliothek irgendwann auslaufen oder fehlerhaft sein, so ist keine Shotgun Surgery (viele Stellen in der Codebasis abändern) nötig. Die eigentliche Code-Basis beziehungsweise der Großteil des Codes beschäftigt sich nicht mit der eigentlichen Ermittlung der Feiertage. Somit kann die Abhängigkeit rausgeschmissen, eine neue eingefügt werden und letztendlich müssen nur wenige Zeilen Code abgeändert werden.<br><br>Das hat auch zur Folge, dass die Facade nicht angefasst/angepasst werden muss und somit muss nur das neue/abgeänderte Subsystem neu in die Produktion eingespeist werden.<br><br>Neben der Möglichkeit eines Users, kann auch von anderen Systemen oder Anwendungen über die Facade auf das Subsystem zugegriffen werden.</div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 12:15:05 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1015594645</guid>
      </item>
      <item>
         <title>Beispiel für die Anwendung des Musters in der Praxis</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1015600301</link>
         <description><![CDATA[<div><br><br></div>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/912026644/63fbd2c9c1a69ac4a4b062791816a61e/image.png" />
         <pubDate>2020-12-14 12:18:42 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1015600301</guid>
      </item>
      <item>
         <title>Codebeispiel</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1015613153</link>
         <description><![CDATA[<div>Stellt man sich die Funktionalität eines Auto-Motors vor, so müssen (selbst wenn man es vereinfacht) viele Dinge zusammenspielen.<br><br>Ein Code-Beispiel in dem nun alles aktiviert werden muss, sieht so aus:<br><br>airFlowController.takeAir()<br>fuelInjector.on()<br>fuelInjector.inject()<br>starter.start()<br>coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP)<br>coolingController.run()<br>catalyticConverter.on()<br><br>und für das Abschalten der Luftzufuhr, der Injektoren und des Kühlsystems sind ähnlich viele Schritte nötig.<br>Stellt man sich nun vor, dass dies ein vom Nutzer zu verwendendes System darstellt, würde es sehr komplex werden, da es sich lediglich um eine Funktionalität handelt. <br><br><strong>public</strong> <strong>class</strong> MotorFacade {<br>    <br><strong>private</strong> <strong>static</strong> <strong>int</strong> DEFAULT_COOLING_TEMP = 90;<br><strong>private</strong> <strong>static</strong> <strong>int</strong> MAX_ALLOWED_TEMP = 50;<br><strong>private</strong> FuelInjector fuelInjector = <strong>new</strong> FuelInjector();<br><strong>private</strong> AirFlowController airFlowController = <strong>new</strong> AirFlowController();<br><strong>private</strong> Starter starter = <strong>new</strong> Starter();<br><strong>private</strong> CoolingController coolingController = <strong>new</strong> CoolingController();<br><strong>private</strong> CatalyticConverter catalyticConverter = <strong>new</strong> CatalyticConverter();<br><br><strong>public</strong> <strong>void</strong> starteMotor() {<br>        fuelInjector.on();<br>        airFlowController.takeAir();<br>        fuelInjector.on();<br>        fuelInjector.inject();<br>        starter.start();<br>        coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP);<br>        coolingController.run();<br>        catalyticConverter.on();<br>    }<br><br><strong>public</strong> <strong>void</strong> stoppeMotor() {<br>        fuelInjector.off();<br>        catalyticConverter.off();<br>        coolingController.cool(MAX_ALLOWED_TEMP);<br>        coolingController.stop();<br>        airFlowController.off();<br>    }<br>}<br><br>public class Nutzklasse {<br><br>        MotorFacade facade;<br>        facade = new MotorFacade();<br><br>        facade.starteMotor();<br>        .....<br>        facade.stoppeMotor();<br>}<br><br><br><br><br><br>So könnte der Aufbau einer RemoteFacade inklusive EJB aussehen.<br><br><br><br>@Remote<br><strong>public</strong> <strong>interface</strong> RemoteMotorFacade {<br>    <br>    <strong>public</strong> <strong>void</strong> starteMotor();<br><br>    <strong>public</strong> <strong>void</strong> stoppeMotor();<br>}<br><br><br>@Stateless<br>public class NutzKlasseFacade implements RemoteMotorFacade {<br><br><strong>private</strong> <strong>static</strong> <strong>int</strong> DEFAULT_COOLING_TEMP = 90;<br><strong>private</strong> <strong>static</strong> <strong>int</strong> MAX_ALLOWED_TEMP = 50;<br><strong>private</strong> FuelInjector fuelInjector = <strong>new</strong> FuelInjector();<br><strong>private</strong> AirFlowController airFlowController = <strong>new</strong> AirFlowController();<br><strong>private</strong> Starter starter = <strong>new</strong> Starter();<br><strong>private</strong> CoolingController coolingController = <strong>new</strong> CoolingController();<br><strong>private</strong> CatalyticConverter catalyticConverter = <strong>new</strong> CatalyticConverter();<br><br>@Override<br><strong>public</strong> <strong>void</strong> starteMotor() {<br>        fuelInjector.on();<br>        airFlowController.takeAir();<br>        fuelInjector.on();<br>        fuelInjector.inject();<br>        starter.start();<br>        coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP);<br>        coolingController.run();<br>        catalyticConverter.on();<br>    }<br><br>@Override<br><strong>public</strong> <strong>void</strong> stoppeMotor() {<br>        fuelInjector.off();<br>        catalyticConverter.off();<br>        coolingController.cool(MAX_ALLOWED_TEMP);<br>        coolingController.stop();<br>        airFlowController.off();<br>    }<br><br>}<br><br><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 12:26:20 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1015613153</guid>
      </item>
      <item>
         <title>Synonyme</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1015631345</link>
         <description><![CDATA[<div>Fassade<br>Facade<br>Business Facade</div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 12:36:05 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1015631345</guid>
      </item>
      <item>
         <title>Schaubild mit Facade</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1015661049</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/912026644/d22668007677e44336212750cc3977cb/image.png" />
         <pubDate>2020-12-14 12:50:49 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1015661049</guid>
      </item>
      <item>
         <title>Motivation/Einsatzgebiet in der Praxis</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1016347958</link>
         <description><![CDATA[<div>Generell greifen die Anwendungsfälle und Einsatzgebiete auf die Vorteile zurück.<br>Anwendungsfälle sind sinnvoll bei:<br>- angestrebter Reduzierung der Abhängigkeiten zwischen dem Client und dem benutzten Subsystem:<br>- einer Schichtenunterteilung des Systems. Die Schichten kommunizieren nur noch über Fassaden, die den Zugang zum Subsystem darstellen. Somit wird das System unterteilt und die Abhängigkeiten zwischen den Teilsystemen gesenkt.<br>- zur Verfügung stellen einer vereinfachten Schnittstelle um ein kompliziertes Subsystem zu bedienen.</div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 15:33:43 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1016347958</guid>
      </item>
      <item>
         <title>Schaubild ohne Facade</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1016359125</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/912026644/c34950bb1aa4b5c331fd2c4b5312ab93/image.png" />
         <pubDate>2020-12-14 15:35:52 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1016359125</guid>
      </item>
      <item>
         <title>Nachteile</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1016367715</link>
         <description><![CDATA[<div><strong>Zusätzliche Indirektionsstufe: </strong>Zusätzliche Schicht (die Fassade selbst) muss implementiert werden. Führt zu zusätzlicher Rechenzeit für Methoden- und Funktionsaufrufe, Speicherzugriffe etc.<br><strong>Implementierung aufwändig: </strong>Hoher Implementierungsaufwand ist mit dem erstellen einer Fassade verbunden. Besonders wenn es darum geht so eine Schnittstelle in bereits bestehenden Code einzufügen.<br><strong>Hoher Abhängigkeitsgrad von der Facade-Schnittstelle: </strong>Wenn es Probleme mit der Schnittstelle gibt, geht unter Umständen gar nichts mehr. Zudem kann es zu zusätzlichen Performanceproblemen kommen wenn zuviel Funktionalität in der Schnittstelle geschrieben wird.</div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 15:37:33 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1016367715</guid>
      </item>
      <item>
         <title>Vorteile der Fassade</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1016368008</link>
         <description><![CDATA[<div><strong>Vereinfachte Schnittstelle und verstecken der Komplexität:</strong> Der Client kann ein komplexes System einfacher verwenden ohne die Klassen des Subsystems zu kennen. Über eine Schnittstelle kann er das System bedienen ohne die volle Funktionalität dahinter zu kennen.<br><strong>Entkopplung</strong> <strong>des Client vom Subsystem: </strong>Da der Client nur noch gegen die Fassade arbeitet, ist er unabhängig von Änderungen und Anpassungen im Subsystem. <br><strong>Änderungsstabilität, leicht erweiterbar und geringerer Änderungsaufwand:</strong><br>Durch die Entkopplung,  beeinträchtigen Änderungen die im Subsystem erfolgen, nicht den Client sondern höchstens die Fassade. Die Schnittstelle der Fassade nach außen bleibt aber bei Änderungen unbetroffen. Ohne zwischengeschaltete Schnittstelle müsste immer der Client mit angepasst werden.</div>]]></description>
         <enclosure url="" />
         <pubDate>2020-12-14 15:37:36 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1016368008</guid>
      </item>
      <item>
         <title>Beispiel für die Anwendung des Musters in Java</title>
         <author>schuetzlito</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1016755158</link>
         <description><![CDATA[<div>JOptionPane ist eine Fassade für Dialogfenster in Java. Mit den Methoden showMessageDialog() und showInputDialog() stellt sie dem Client eine einfache Schnittstelle zur Erstellung von Dialogfenstern zur Verfügung. Der Client muss dabei keine Kenntnis von den verwendeten Swingkomponenten (z.B. Frame), Layoutmanagern (z.B. BorderLayout) und Listener (z.B Actionlistener) haben.</div>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/912026644/6b6c9610ea3d7f22b2ecd7a441958d01/image.png" />
         <pubDate>2020-12-14 16:50:16 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1016755158</guid>
      </item>
      <item>
         <title>                                                           Das Entwurfsmuster Facade - Tim Schützle, Dennis Godec im Rahmen von Ausgewählte Aspekte des Software Engineering 1</title>
         <author>dennisgo</author>
         <link>https://padlet.com/schuetzlito/facade/wish/1019682092</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2020-12-15 12:48:41 UTC</pubDate>
         <guid>https://padlet.com/schuetzlito/facade/wish/1019682092</guid>
      </item>
   </channel>
</rss>
