Frage

Ich war auf der Suche auf dem Proxy-Muster, und mir scheint es eine ganze Menge, wie der Ausstatter, Adapter und Brücke Muster. Bin ich Missverständnis etwas? Was ist der Unterschied? Warum soll ich verwenden, um das Proxy-Muster im Vergleich zu den anderen? Wie haben Sie sie in der Vergangenheit in der realen Welt Projekte?

War es hilfreich?

Lösung

Proxy, Ausstatter, Adapter und Brücke sind alle Variationen auf „Verpackung“ eine Klasse. Aber ihre Verwendungen sind unterschiedlich.

  • Proxy verwendet werden könnten, wenn Sie wollen ein Objekt lazy-instanziiert, oder die Tatsache verbergen, dass Sie einen Remote-Service anrufen, oder steuern den Zugriff auf das Objekt.

  • Decorator wird auch als "Smart-Proxy." Diese wird verwendet, wenn Sie die Funktionalität zu einem Objekt hinzufügen mögen, aber nicht durch dieses Objekt Typen erstreckt. Auf diese Weise können Sie so zur Laufzeit tun.

  • Adapter wird verwendet, wenn Sie eine abstrakte Schnittstelle haben, und Sie wollen, dass die Schnittstelle zu einem anderen Objekt abzubilden, die ähnliche funktionelle Rolle hat, aber eine andere Schnittstelle.

  • Brücke ist sehr ähnlich wie Adapter, aber wir nennen es Bridge, wenn Sie sowohl die abstrakte Schnittstelle und die zugrunde liegende Implementierung definieren. D. h Sie sind nicht bis zu einem gewissen Vermächtnis oder Drittanbieter-Code anzupassen, sie ist der Designer aller Code, aber Sie müssen verschiedene Implementierungen tauschen können.

  • Fassade ist ein höherer Ebene (sprich: einfachere) Schnittstelle zu einem Subsystem von einer oder mehreren Klassen. Angenommen, Sie ein komplexes Konzept, die mehrere Objekte darzustellen erfordert. Änderungen an diesen Satz von Objekten ist verwirrend, weil man nicht immer wissen, welches Objekt die Methode, die Sie anrufen müssen hat. Das ist die Zeit, um eine Fassade zu schreiben, die High-Level-Methoden für alle komplexen Operationen bietet Ihnen die Sammlung von Objekten zu tun. Beispiel: a. Domänenmodell für eine Schule Abschnitt, mit Methoden wie countStudents(), reportAttendance(), assignSubstituteTeacher(), und so weiter

Andere Tipps

Als Bills Antwort sagt, ihre Anwendungsfälle sind unterschiedliche .

So sind ihre Strukturen.

  • Proxy und Decorator haben beide die gleiche Schnittstelle wie ihre gewickelten Typen, aber der Proxy erstellt eine Instanz unter der Haube, während der Dekorateur eine Instanz nimmt in der Konstruktor.

  • Adapter und Fassade haben beide eine andere Schnittstelle als das, was sie wickeln. Aber der Adapter leitet sich von einer bestehenden Schnittstelle, während die Fassade eine neue Schnittstelle schafft.

  • Brücke und Adapter beiden Punkte, an einem bestehenden Typ. Aber die Brücke auf einer abstrakten Art zeigen, und der Adapter an einen konkreten Typ hinweisen könnten. Die Brücke ermöglicht es Ihnen, die Implementierung zur Laufzeit zu koppeln, während der Adapter in der Regel nicht.

Meine Meinung zu dem Thema.

Alle vier Muster viel gemeinsam haben, sind alle vier manchmal informell Wrapper oder Wrapper-Muster genannt. Jede Verwendung Zusammensetzung unter Umhüllen und die Ausführung an das Subjekt an einem bestimmten Punkt zu delegieren, tut Mapping einen Methodenaufruf zu einem anderen. Sie ersparen Client die Notwendigkeit, ein anderes Objekt zu konstruieren, der mit und kopieren Sie über alle relevanten Daten. Wenn sinnvoll genutzt, speichern sie Speicher und Prozessor.

Durch die lose Kopplung fördern sie machen einmal stabilen Code weniger ausgesetzt unvermeidliche Veränderungen und besser lesbar für andere Entwickler.

Adapter

Adapter passt Subjekt (adaptierten) an eine andere Schnittstelle. So können wir Objekt platziert werden, um eine Sammlung von nominell verschiedenen Typen hinzufügen können.

Adapter aussetzen nur relevante Methoden zum Client, alle anderen beschränken können, Nutzungsabsichten für bestimmte Zusammenhänge offenbart, wie externe Bibliothek anzupassen, machen es scheinen weniger allgemein und mehr auf unsere Anwendungsanforderungen. Adapter erhöht die Lesbarkeit und Selbstbeschreibung unseres Codes.

Adapter Schilden ein Team von flüchtigem Code von anderen Teams; ein Leben Retter Werkzeug, wenn es mit Offshore-Teams zu tun; -)

Weniger genannten Zweck es das Thema Klasse von mehr als Anmerkungen zu verhindern. Mit so vielen Frameworks auf Basis von Annotationen wird dies wichtiger denn je Nutzung.

Adapter hilft rund um Java Begrenzung der nur einfache Vererbung zu erhalten. Es kann mehrere adaptees unter einem Umschlag kombiniert Eindruck von Mehrfachvererbung zu geben.

Code-weise, Adapter ist „dünn“. Es sollte nicht viel Code zu der adaptierten Klasse hinzuzufügen, außer einfach die adaptierten Methode und gelegentlichen Datenkonvertierungen Aufruf notwendig, solche Anrufe zu tätigen.

Es gibt nicht viele gute Beispiele Adapter in JDK oder Basisbibliotheken. Anwendungsentwickler erstellen Adapter, Bibliotheken spezifische Schnittstellen zu Anwendung anzupassen.

Decorator

Decorator nicht nur Delegierte, nicht Karten nur eine Methode zum anderen, sie mehr, sie Verhalten einiger gegenständlichen Verfahren ändern, kann es nicht gegenständliche Verfahren überhaupt nennen entscheiden, delegieren zu einem anderen Objekt, ein Hilfsobjekt.

Dekorateure hinzufügen typischerweise (transparent) -Funktionalität Wrapped Objekt wie Logging, Verschlüsselung, Formatierung oder Kompression unterliegt. Diese neue Funktionalität kann eine Menge neuen Code bringen. Daher Dekorateure sind in der Regel viel „fettere“ dann Adapter.

Decorator muss eine Unterklasse von Subjekt Schnittstelle sein. Sie können transparent statt seiner Themen verwendet werden. Siehe BufferedOutputStream, es ist immer noch Output und kann als solche verwendet werden. Das ist ein großer technischer Unterschied von Adaptern.

Textbuch Beispiele für ganze Dekorateure Familie ist leicht in JDK - der Java-IO. Alle Klassen wie BufferedOutputStream , FilterOutputStream und Object sind Dekorateure von Output . Sie können geschichtet Zwiebel, wo man einen Dekorateur wieder eingerichtet ist, mehr Funktionalität hinzufügen.

Proxy

Proxy ist kein typisches Wrapper. Das verhüllte Objekt, das Proxy-Subjekt, kann noch nicht zum Zeitpunkt der Proxy-Erstellung existiert. Proxy schafft oft es intern. Es kann ein schwerer Gegenstand auf Verlangen sein, oder es ist entferntes Objekt in verschiedenen JVM oder verschiedenen Netzwerkknoten und sogar ein Nicht-Java-Objekt, eine Komponente in nativen Code. Sie gilt nicht für notwendig, wickeln oder gar auf ein anderes Objekt übertragen.

Die typischen Beispiele sind Remote-Proxies, schweres Objekt initialisierenrs und Zugang Proxies.

  • Remote Proxy - Thema ist auf dem Remote-Server, andere JVM oder auch nicht Java System. Proxy übersetzt Methodenaufrufe RMI / REST / SOAP-Calls oder was auch immer notwendig ist, Client von dem Risiko der Basis Abschirmung Technologie.

  • Lazy Load Proxy - vollständig initialisieren Objekt nur die erste Nutzung oder erste intensive Nutzung.

  • Zugriffsproxy -. Steuert den Zugriff auf Thema

Fassade

Fassade steht in engen Zusammenhang mit Design-Prinzip des kleinsten Wissens (Gesetz von Demeter) zugeordnet ist. Fassade ist sehr ähnlich Adapter. Beide wickeln, sie beide Karte eines Objekts zum anderem, aber sie unterscheiden sich in der Absicht. Fassade flacht komplexe Struktur eines Subjekts, komplexe Objektgraphen, vereinfacht den Zugang zu einer komplexen Struktur.

Fassade wickelt eine komplexe Struktur, eine flache Oberfläche zur Datei angeben. Dies verhindert, dass Client-Objekt von hier zu inneren Beziehungen in Objektstruktur freigelegt ist lose Kopplung fördern.

Brücke

Komplexere Variante Adapter Muster, bei dem nicht nur Implementierung variiert, sondern auch Abstraktion. Es fügt eine weitere Umleitung der Delegation. Die zusätzliche Delegation ist die Brücke. Es abkoppelt Adapter auch von der Schnittstelle anzupassen. Es erhöht die Komplexität mehr als jede andere der anderen Wickelmuster, so gilt vorsichtig.

Unterschiede in der Konstrukteurs-

Muster Unterschiede sind auch auf der Hand, wenn sie bei ihren Konstrukteuren suchen.

  • Proxy ist nicht ein vorhandenes Objekt gewickelt wird. Es ist kein Thema in Konstruktor.

  • Decorator und Adapter umbrochen bereits Objekt existiert, und so ist in der Regel
    im Konstruktor zur Verfügung gestellt.

  • Fassade Konstruktor Wurzelelement eines ganzen Objektgraphen, sonst sieht es aus gleiche wie Adapter.

Praxisbeispiel - JAXB Rangierung Adapter . Zweck dieses Adapters ist Abbildung einer einfachen flachen Klasse komplexere Struktur erforderlich extern und „umweltfreundlich“ subject Klasse mit übermäßigen Anmerkungen zu verhindern.

Es gibt eine große Überschneidungen in vielen der GoF-Muster. Sie sind alle auf der Kraft des Polymorphismus gebaut und manchmal nur wirklich in der Absicht unterscheiden. (Strategie gegenüber den Staaten)

Mein Verständnis von Mustern erhöht das 100-fache nach dem Lesen Head First Design Patterns .

Ich kann es nur empfehlen!

Alle guten Antworten von Experten haben bereits erklärt, was tut jedes Muster steht.

Ich will deco Schlüsselpunkte.

Decorator:

  1. Add Verhalten zur Laufzeit zum Objekt . Die Vererbung ist der Schlüssel, um diese Funktionalität zu erreichen, die beide Vor- und Nachteile dieses Musters ist.
  2. Es ändert das Verhalten der Schnittstelle.

z. (Mit Chaining): java.io Paketklassen bezogen auf InputStream & OutputStream Schnittstellen

FileOutputStream fos1 = new FileOutputStream("data1.txt");  
ObjectOutputStream out1 = new ObjectOutputStream(fos1);

Proxy:

  1. Verwenden Sie es für faule Initialisierung, Performance-Verbesserung durch die Objekt-Caching und Zugriff auf den Client / Anrufer Steuerung . Es kann alternatives Verhalten bereitstellen oder reales Objekt aufrufe. Während dieses Prozesses kann es neue Objekt erstellen.
  2. Im Gegensatz zu Decorator , der Verkettung von Objekten ermöglicht, Proxy nicht Verkettungs nicht zulassen.

z.B .: java.rmi Paketklassen.

Adapter:

  1. Es erlaubt zwei unabhängige Schnittstellen gemeinsam durch die verschiedene Objekte zu arbeiten , möglicherweise dieselbe Rolle zu spielen.
  2. Es ändert Original-Schnittstelle .

z. java.io.InputStreamReader (InputStream gibt eine Reader)

Bridge:

  1. Es können beide Abstraktionen und Implementierungen unabhängig variieren .
  2. Sie verwendet Komposition der Vererbung .

z. Collection-Klassen in java.util. List von ArrayList implementiert.

Key Notes:

  1. Adapter eine andere Schnittstelle zu seinem Thema bietet. Proxy bietet die gleiche Schnittstelle. Decorator bietet eine erweiterte Schnittstelle.
  2. Adapter ändert eine Schnittstelle des Objekts, Decorator ein Verantwortlichkeiten Objekts verbessert.
  3. Decorator und Proxy haben unterschiedliche Zwecke, aber ähnliche Strukturen
  4. Adapter macht die Dinge funktionieren, nachdem sie entworfen wird; Brücke macht sie arbeiten, bevor sie sind.
  5. Brücke ist so konzipiert, up-front die Abstraktion und die Umsetzung zu lassen unabhängig voneinander variieren. Adapter Nachrüstung nicht verwandte Klassen zusammenarbeiten
  6. machen
  7. Decorator ist so konzipiert, fügen Sie Verantwortlichkeiten auf Objekte ohne Subclassing lassen.

Hier finden Sie aktuelle große SE Fragen / Artikel über Beispiele für verschiedene Design-Muster

Wenn das Decorator-Muster verwenden?

Wann verwendet man die Brücke Muster? Wie unterscheidet es sich von Adapter-Muster?

Unterschiede zwischen Proxy und Decorator-Muster

Sie sind ziemlich ähnlich, und die Grenzen zwischen ihnen sind ziemlich grau. Ich schlage vor, Sie lesen die Proxy Pattern und Decorator-Muster Einträge in dem c2-Wiki.

Die Einträge und Diskussionen sind recht umfangreich, und sie auch einen Link zu anderen einschlägigen Artikeln. By the way, ist die c2 Wiki ausgezeichnet, wenn es um die Nuancen zwischen verschiedenen Mustern fragen.

die c2-Einträge zu summieren, würde ich sagen, ein Dekorateur fügt / Änderungen Verhalten, sondern ein Proxy hat mehr mit Zugriffskontrolle (faul Instanziierung, Fernzugriff, Sicherheit usw.) zu tun. Aber wie ich schon sagte, sind die Linien zwischen ihnen grau, und ich sehe, Verweise auf Proxies, die leicht als Dekorateure und umgekehrt betrachtet werden könnten.

Das ist Zitat aus Head First Design Patterns

Definitionen gehört zu buchen. Beispiele gehört mir.

Decorator - Gibt die Schnittstelle nicht ändern, sondern fügt Verantwortung. Angenommen, Sie ein Auto-Schnittstelle, wenn Sie dies implementieren für verschiedene Modelle des Autos (s, sv, sl) können Sie auf müssen mehr Verantwortung hinzufügen für einige Modelle. Wie hat Schiebedach, Airbag etc ..

Adapter - Wandelt eine Schnittstelle zu einem anderen. Sie haben ein Auto-Schnittstelle und Sie möchten, dass es wie Jeep handeln. So können Sie das Auto nehmen, ändern und in einen Jeep drehen. Da es kein echter Jeep ist. Aber wirkt wie ein Jeep.

Fassade - macht eine Schnittstelle einfacher. Angenommen, Sie Auto, Flugzeug, Schiff-Schnittstellen haben. Eigentlich alles, was Sie brauchen, ist eine Klasse, die die Menschen von einem Ort zum anderen sendet. Sie mögen zu entscheiden, Fassade, welches Fahrzeug zu benutzen. Dann sammeln Sie alle jene Schnittstelle Referenzen unter 1 Dach und lassen Sie ihn / Delegierten entscheiden, es einfach zu halten.

Kopf bis Fuß: „Eine Fassade nicht nur eine Schnittstelle vereinfacht, abkoppelt es einen Client von einem Subsystem von Komponenten. Fassaden und Adapter können mehrere Klassen wickeln, aber eine Absicht der Fassade ist zu vereinfachen, während ein Adapters ist die Schnittstelle zu etwas anderes zu konvertieren. "

Alle vier Muster beinhalten Einwickeln Innen Objekt / Klasse mit Außen ein, so dass sie strukturell sehr ähnlich. Ich würde Differenz durch den Zweck skizzieren:

  • Proxy verkapselt Zugang in außen nach innen.
  • Decorator modifiziert oder erweitert Verhalten der inneren mit der äußeren.
  • Adapter wandelt Schnittstelle von innen nach außen.
  • Bridge trennt invariable Teil des Verhaltens (äußeren) von Variablen oder plattformabhängigen Teil (inneren).

Und durch die Schnittstelle Variation zwischen inneren und äußeren Objekten:

  • in Proxy Schnittstellen sind gleich.
  • in Decorator Schnittstellen sind gleich.
  • in Adapter Schnittstellen unterschiedlich sind formal, aber den gleichen Zweck erfüllen.
  • in Brücke Schnittstellen unterschiedlich sind konzeptionell.

ich es recht häufig verwenden, wenn Webdiensten. Das Proxy-Muster soll wohl etwas mehr pragmatisch, wie ‚Wrapper Muster umbenannt werden.“ Ich habe auch eine Bibliothek, die ein Proxy zu MS Excel ist. Es macht es sehr einfach, Excel zu automatisieren, ohne sich um Hintergrunddetails kümmern, wie was Version installiert ist (falls vorhanden).

Detail Umsetzung Sprechen, finde ich einen Unterschied zwischen Proxy und Ausstatter, Adapter, Fassade ... In einem gemeinsamen Durchführung dieser Muster ein Zielobjekt durch ein einschließende Objekt gewickelt gibt. Client verwendet Objekt statt Zielobjekt umschließt. Und das Zielobjekt tatsächlich eine wichtige Rolle in einige der Methoden des Objekts einschließe spielen.

Doch im Falle von Proxy-Objekt umgibt können einige Methoden, die von sich selbst spielen, ist es Zielobjekt nur initialisieren, wenn der Client einige Methoden aufruft, die es Zielobjekt in teilnehmen muss. Diese verzögerte Initialisierung ist. Im Fall von anderen Mustern wird umschließenden Objekt auf Zielobjekt praktisch basiert. So Zielobjekt ist immer mit umschließenden Objekt in Konstrukteuren / Setter initialisiert zusammen.

Eine andere Sache, tut ein Proxy genau das, was ein Ziel hat, während andere Muster mehr Funktionalität zum Ziel hinzuzufügen.

würde Ich mag Beispiele zu Bill Karwing Antwort hinzuzufügen (was übrigens groß ist.) Ich füge auch einige wichtige Unterschiede in der Umsetzung, dass ich das Gefühl fehlt

Zitiert Teile sind aus Antwort von [ https://stackoverflow.com/a/350471/1984346] ( Bill Karwing)

  

Proxy, Ausstatter, Adapter und Brücke sind alle Variationen auf „Verpackung“ eine Klasse.   Aber ihre Verwendungen sind unterschiedlich.

     
      
  • Proxy verwendet werden könnten, wenn Sie wollen ein Objekt lazy-instanziiert, oder   verstecken die Tatsache, dass Sie einen Remote-Service anrufen, oder den Zugang zu kontrollieren   zum Objekt.
  •   

ProxyClass und Object, die Proxy-Klasse zugänglich ist, sollten gleichen Schnittstelle implementieren, so dass sie austauschbar

Beispiel - Proxy teures Objekt

class ProxyHumanGenome implements GenomeInterface  {
    private $humanGenome = NULL; 

    // humanGenome class is not instantiated at construct time
    function __construct() {
    }

    function getGenomeCount() {
        if (NULL == $this->humanGenome) {
            $this->instantiateGenomeClass(); 
        }
        return $this->humanGenome->getGenomeCount();
    }
} 
class HumanGenome implement GenomeInterface { ... }
  
      
  • Decorator wird auch als "Smart-Proxy." Diese wird verwendet, wenn Sie wollen   erweitern die Funktionalität eines Objekts, aber nicht durch das Objekt der Verlängerung   Art. Auf diese Weise können Sie so zur Laufzeit tun.
  •   

DecoratorClass sollte (könnte) implementieren erweiterte Schnittstelle von Object. So könnte die Object durch DecoratorClass ersetzt werden, aber nicht umgekehrt.

Beispiel - adding addition Funktionalität

class DecoratorHumanGenome implements CheckGenomeInterface  {

    // ... same code as previous example

    // added functionality
    public function isComplete() {
        $this->humanGenome->getCount >= 21000
    }
}

interface CheckGenomeInterface extends GenomeInterface {

    public function isComplete();

}

class HumanGenome implement GenomeInterface { ... }
  
      
  • Adapter wird verwendet, wenn Sie eine abstrakte Schnittstelle haben, und Sie möchten   Karte, die Schnittstelle zu einem anderen Objekt, das funktional ähnlich   Rolle, aber eine andere Schnittstelle.
  •   

implentation Unterschiede Proxy, Ausstatter, Adapter

Adapter bietet eine andere Schnittstelle zu seinem Thema. Proxy bietet die gleiche Schnittstelle. Ausstatter bietet eine erweiterte Schnittstelle.

  
      
  • Brücke ist sehr ähnlich wie Adapter, aber wir nennen es Bridge, wenn Sie   definieren sowohl die abstrakte Schnittstelle und die zugrunde liegende Implementierung.   D. h Sie sind nicht bis zu einem gewissen Vermächtnis oder Drittanbieter-Code anzupassen, sind Sie   der Designer aller Code, sondern müssen Sie in der Lage sein zu tauschen   verschiedene Implementierungen.

  •   
  • Fassade ist eine höherer Ebene (sprich: einfachere) Schnittstelle zu einem Subsystem   eine oder mehr Klassen. Angenommen, Sie ein komplexes Konzept haben, das erfordert   mehr Objekte darzustellen. Änderungen an diesen Satz von Objekten   ist verwirrend, weil man nicht immer wissen, welches Objekt das hat   Verfahren müssen Sie anrufen. Das ist die Zeit, um eine Fassade zu schreiben,   bietet High-Level-Methoden für alle komplexen Operationen, die Sie tun können,   zur Sammlung von Objekten. Beispiel: Ein Domain Model für eine Schule   Schnitt mit Methoden wie countStudents(), reportAttendance(),   assignSubstituteTeacher(), und so weiter.

  •   

Die meisten Informationen in dieser Antwort ist von https://sourcemaking.com/design_patterns , die ich als ausgezeichnetes Hilfsmittel empfehlen für Design-Muster.

Ich glaube, Code wird eine klare Ideen geben (für andere Antworten als auch ergänzen). siehe unten, (Fokus die Typen, die eine Klasse implementiert und Wraps)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Proxy */

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("PROXY");
            Console.WriteLine(Environment.NewLine);

            //instead of creating here create using a factory method, the facory method will return the proxy
            IReal realProxy = new RealProxy();
            Console.WriteLine("calling do work with the proxy object ");
            realProxy.DoWork();

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("ADAPTER");
            Console.WriteLine(Environment.NewLine);

            /*Adapter*/
            IInHand objectIHave = new InHand();
            Api myApi = new Api();
            //myApi.SomeApi(objectIHave); /*I cant do this, use a adapter then */
            IActual myAdaptedObject = new ActualAdapterForInHand(objectIHave);
            Console.WriteLine("calling api with  my adapted obj");
            myApi.SomeApi(myAdaptedObject);


            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("DECORATOR");
            Console.WriteLine(Environment.NewLine);

            /*Decorator*/
            IReady maleReady = new Male();
            Console.WriteLine("now male is going to get ready himself");
            maleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReady = new Female();
            Console.WriteLine("now female is going to get ready her self");
            femaleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady maleReadyByBeautician = new Beautician(maleReady);
            Console.WriteLine("now male is going to get ready by beautician");
            maleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReadyByBeautician = new Beautician(femaleReady);
            Console.WriteLine("now female is going to get ready by beautician");
            femaleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            Console.ReadLine();


        }
    }

    /*Proxy*/

    public interface IReal
    {
        void DoWork();
    }

    public class Real : IReal
    {
        public void DoWork()
        {
            Console.WriteLine("real is doing work ");
        }
    }


    public class RealProxy : IReal
    {
        IReal real = new Real();

        public void DoWork()
        {
            real.DoWork();
        }
    }

    /*Adapter*/

    public interface IActual
    {
        void DoWork();
    }

    public class Api
    {
        public void SomeApi(IActual actual)
        {
            actual.DoWork();
        }
    }

    public interface IInHand
    {
        void DoWorkDifferently();
    }

    public class InHand : IInHand
    {
        public void DoWorkDifferently()
        {
            Console.WriteLine("doing work slightly different ");
        }
    }

    public class ActualAdapterForInHand : IActual
    {
        IInHand hand = null;

        public ActualAdapterForInHand()
        {
            hand = new InHand();
        }

        public ActualAdapterForInHand(IInHand hnd)
        {
            hand = hnd;
        }

        public void DoWork()
        {
            hand.DoWorkDifferently();
        }
    }

    /*Decorator*/

    public interface IReady
    {
        void GetReady();
    }

    public class Male : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
        }
    }

    public class Female : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
            Console.WriteLine("Make up....");
        }
    }

    //this is a decorator
    public class Beautician : IReady
    {
        IReady ready = null;

        public Beautician(IReady rdy)
        {
            ready = rdy;
        }

        public void GetReady()
        {
            ready.GetReady();
            Console.WriteLine("Style hair ");

            if (ready is Female)
            {
                for (int i = 1; i <= 10; i++)
                {
                    Console.WriteLine("doing ready process " + i);
                }

            }
        }
    }

}

Design-Muster ist nicht Mathematik, es ist eine Kombination aus Kunst und Software-Engineering. Es gibt nichts Vergleichbares für diese Requirment Sie Proxy verwenden müssen, überbrücken usw. Entwurfsmuster geschaffen werden, um die Probleme zu lösen. Wenn Sie ein Design-Problem antizipieren, verwenden Sie es dann. Basierend auf der Erfahrung, kommen Sie für bestimmtes Problem zu wissen, welche Muster zu verwenden. Wenn Sie in soliden Design-Prinzipien sind gut, würden Sie Entwurfsmuster implementiert, ohne es zu wissen Muster ist. Gängiges Beispiel ist statergy und Fabrikmuster

konzentriert daher mehr auf feste desighn Prinzipien, saubere Codierung Prinzipien und ttd

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top