Frage

Ich habe versucht, viele Artikel über dofactory , wikipedia und viele Websites zu lesen. Ich habe keine Ahnung, auf Unterschiede zwischen den Brückenmustern und dem Strategie-Muster.

Ich weiß, beiden entkoppeln eine Abstraktion von der Implementierung und Umsetzung zur Laufzeit geändert werden.

Aber ich weiß noch nicht, in welcher Situation ich Strategie oder eine Situation, in der Verwendung sollte ich soll Brücke verwendet werden.

War es hilfreich?

Lösung

Semantics. Aus wikipedia :

  

Das UML-Klassendiagramm für die Strategie   Muster ist das gleiche wie das Diagramm für   die Brücke Muster. Allerdings sind diese beiden   Entwurfsmuster sind nicht gleich in   ihre Absicht. Während die Strategie   Muster für das Verhalten gemeint, die   Brückenmuster ist für Struktur gemeint.

     

Die Kopplung zwischen dem Kontext und   die Strategien sind enger als die   Kopplung zwischen der Abstraktion und   die Umsetzung in der Brücke   Muster.

Wie ich es verstehen, verwenden Sie das Strategie-Muster, wenn Sie Verhalten sind abstrahiert, die von einer externen Quelle bereitgestellt werden könnte (z. B. Config einige Plugin Assembly laden angeben können), und Sie sind mit dem Brückenmuster wenn Sie verwenden die gleichen Konstrukte Ihren Code ein bisschen übersichtlicher zu machen. Der eigentliche Code wird sehr ähnlich aussehen -. Sie Anwendung nur die Muster für etwas andere Gründe

Andere Tipps

Die Brücke Muster ist ein Strukturmuster (wie Sie eine Software-Komponente BUILD tun?). Das Strategiemuster ist ein dynamisches Muster (WIE SIE EIN VERHALTEN Software ausführen möchten?).

Die Syntax ist ähnlich, aber die Ziele sind unterschiedlich:

  • Strategie : Sie mehr Möglichkeiten haben eine Operation zu tun; mit Strategie, können Sie den Algorithmus zur Laufzeit wählen und Sie können ohne viele Nebenwirkungen bei der Kompilierung-Zeit eine einzige Strategie modifizieren;
  • Brücke : Sie können die Hierarchie der Schnittstelle und Klasse aufteilen, verbinden sie mit einem abstrakten Verweis (siehe explication )

Strategie:

  • Kontext zur Strategie gebunden: Der Kontext Klasse (! Möglicherweise Abstrakt, aber nicht wirklich eine Schnittstelle wie u will ein bestimmtes Verhalten kapseln und nicht die gesamte Implementierung) würde wissen, / die Strategie Interface-Referenz enthalten und die Umsetzung die Strategie Verhalten auf sie berufen.
  • Intent ist die Fähigkeit Verhalten zur Laufzeit tauschen

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

Brücke

  • Abstraktion nicht auf die Implementierung gebunden: Die Abstraktion Schnittstelle (oder eine abstrakte Klasse mit den meisten des Verhaltens Zusammenfassung) würde nicht wissen, / die Implementierung Interface-Referenz enthalten
  • Absicht ist es, vollständig die Abstraktion von der Implementierung zu entkoppeln

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    

Brücke : (A Strukturmuster)

Bridge Muster abkoppelt Abstraktion und Implementierung und ermöglicht sowohl unabhängig zu verändern.

Verwenden Sie dieses Muster, wenn:

  1. Abstraktionen und Implementierungen nicht bei der Kompilierung
  2. entschieden
  3. Abstraktionen und Implementierungen sollten unabhängig voneinander geändert werden
  4. Änderungen bei der Umsetzung der Abstraktion nicht Anrufer Anwendung beeinflussen
  5. Client sollte von Implementierungsdetails isoliert werden.

Strategie: (Verhaltensmuster)

Strategie-Muster können Sie zwischen mehreren Algorithmen aus einer Familie von Algorithmen zur Laufzeit wechseln.

Mit Strategie-Muster, wenn:

  1. Mehrere Versionen von Algorithmen erforderlich sind
  2. hat das Verhalten der Klasse dynamisch zur Laufzeit geändert werden
  3. Vermeiden Sie bedingte Anweisungen

Related posts:

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

Real World Beispiel für die Strategie-Muster

Ich dachte die gleichen, aber vor kurzem habe ich Brücke zu verwenden, und erkennen, dass Brückenstrategie verwendet und das Hinzufügen von Abstraktion auf den Kontext, so dass Sie später weitere Änderungen vornehmen können den Client ohne Änderung. Wenn Strategie verwenden, ohne die Abstraktion ist das Design nicht so flexibel und kann später an den Client Änderungen benötigen. Aber wenn die ganze Brücke mit dem Design wird noch flexibler. Hier kann man sich, wie von der Strategie zur Brücke gehen, um mehr Flexibilität. Auch gehen wir davon aus, dass jetzt „Visum“ und „Master“ ist nicht nur auf Karten, sondern auf Handys und Chips auch; und wenn wir Brücke benutzen es ist viel einfacher, dass die Unterstützung hinzuzufügen.

 Strategie VS Bridge

Designmustertypen

  • Verhalten: Muster charakterisieren die Art und Weise, in der Klassen oder Objekten interagieren und verteilen Verantwortung
  • Structural: Muster beschäftigen sich mit der Zusammensetzung von Klassen oder Objekten.
  • Creational:. Muster sind besorgt über den Prozess der Objekterstellung

Brücke (Structural)

  

eine Abstraktion von ihrer Implementierung entkoppeln, so dass jeder kann variieren.   unabhängig.    eingeben Bild Beschreibung hier

Nehmen Sie eine Fernbedienung. Die Fernbedienung hat Tasten 1-6. Dies ist die konkrete Klasse im obigen Diagramm. Jede Taste funktioniert unterschiedlich, je nachdem, ob die Fernbedienung für einen Fernseher oder DVD verwendet wird. Die Funktionalität für jede Taste wird von der Umsetzung durch den Implementierer Schnittstelle abstrahiert.

Dies ermöglicht es uns, zu ändern, wie die Fernbedienung für jedes Gerät funktioniert.

Strategie (Behavioral)

  

Definieren Sie eine Familie von Algorithmen, kapseln jeden und sie austauschbar machen.    eingeben Bild Beschreibung hier

Strategie, wenn wir an dem entfernten Szenario suchen. Der „Zustand“ ist die gesamte Fernbedienung, die wir tauschen durch den Kontext der Zustandsreferenz zu ändern. Die "concreteStateA" (TV-Fernbedienung) "concreteStateB" (DVD Remote).

Zusätzlicher Lesestoff:

Zusätzlich zu willcodejavaforfood Antwort, können sie gleich sein, bei der Umsetzung. Allerdings Sie Strategie verwenden, Strategien zu tauschen wie Strategie sortieren, während Sie Brücke verwenden, um die Implementierungen von zwei Objekt zu überbrücken, sagen die ein Datenbank-Wrapper und ein Netzwerkadapter, so dass der Client-Code verwenden können, entweder arbeitet gegen die gleiche API. So ist die Benennung sagt es eigentlich alle

  1. Strategie Muster wird für Verhaltensentscheidungen verwendet, während Brücke Muster für Strukturentscheidungen verwendet wird.

  2. Brigde Muster separats die abstrakten Elemente aus den Implementierungsdetails, während Strategie Muster betroffen macht Algorithmen mehr austauschbar.

Strategie-Muster in UML

Brigde Muster in UML

Strategie-Muster in Swift:

protocol PrintStrategy {
   func print(_ string: String) -> String
}

class Printer {
   let strategy: PrintStrategy

   init(strategy: PrintStrategy) {
      self.strategy = strategy
    }

  func print(_ string: String) -> String {
     return self.strategy.print(string)
  }
}

class UpperCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.uppercased()
    }
}

class LowerCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.lowercased()
    }
}

var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")

var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")

Brigde Muster in Swift:

protocol Appliance {
   func run()
}

protocol Switch {
   let appliance: Appliance {get set}
   func turnOn()
}

class RemoteControl: Switch {
   var appliance: Appliance

   init(appliance: Appliance) {
       self.appliance = appliance
   }

   internal func turnOn() {
      appliance.run()
   }
}

class TV: Appliance {
   internal func run() {
      print("TV is ON")
   }
}

class Stereo: Appliance {
   internal func run() {
      print("Stereo is ON")
   }
}

var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()

var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()

Aus dem Wiki auf Strategie Muster

  

Das UML-Klassendiagramm für die Strategie   Muster ist das gleiche wie das Diagramm für   die Brücke Muster. Allerdings sind diese beiden   Entwurfsmuster sind nicht gleich in   ihre Absicht. Während die Strategie   Muster für das Verhalten gemeint, die   Brückenmuster ist für Struktur gemeint.

     

Die Kopplung zwischen dem Kontext und   die Strategien sind enger als die   Kopplung zwischen der Abstraktion und   die Umsetzung in der Brücke   Muster.

Nur um hinzuzufügen, was bereits über den Mustervergleich (Differenz des Vorsatzes, ...) gesagt worden ist: die Brücke Muster auch strukturiert sind, absichtlich die Abstraktion Hierarchie Seite variieren zu können. In Sprachen wie C # implizieren könnte man eine Abstraktion Basis hat, die virtuellen Methoden als eine Möglichkeit enthält zu beabsichtigte Veränderungen zu ermöglichen, die für bestehende Verbraucher nicht zu Problemen führen. Anders als das die beiden Muster identisch zum größten Teil erscheinen.

Strategiemuster verwendet, wenn Sie zur Laufzeit-Plug-Algorithmus oder Strategie wollen. Als Kategorie der Muster bedeutet auch, dass es mit dem Verhalten der Objekte befasst. Auf der anderen Seite Brücke Strukturmuster und befasst sich mit strukturellen Hierarchie der Objekte. Sie entkoppelt die Abstraktion von der Implementierung durch eine raffinierte Abstraktion zwischen ihnen einzuführen. Raffinierte Abstraktion kann mit der Laufzeit-Strategie gesteckt (In Strategie-Muster) verwechselt werden. Brückenmuster befasst sich mit den strukturellen Aspekten durch einen Mechanismus zu schaffen n Anzahl der Klassen zu vermeiden.

Für Strategie-Muster nur die Umsetzung variiert.

Nehmen wir an, Klasse A Klasse B verwendet, die mehrere Implementierungen zur Verfügung hat. Also in diesem Fall B würde mit dem tatsächlichen Implementierung zur Laufzeit zur Verfügung gestellt abstrakt sein. Dies ist Strategie-Muster

Nun, wenn A sich abstrakt ist. Sowohl A als auch B können variieren. Sie würden Brücke Muster verwenden.

Ich denke, es gibt einen kleinen Unterschied zwischen ihnen im Kontext sie benutzt werden.

Ich benutze die Brücke Muster orthogonale Konzepte zu trennen, die sie zu einem sowohl einem größeren gehören - sie unabhängig voneinander variieren zu lassen. Es handelt sich in der Regel mehrere Abstraktionen.

IMO ist das Strategie-Muster einfacher oder flach. Es dient dazu, OCP sicher, aber nicht notwendigerweise Teil einer anderen und größeres Konzept wie die Brücke Muster.

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