it-swarm.com.de

Was ist der Unterschied zwischen dem Brückenmuster und dem Strategiemuster?

Ich habe versucht, viele Artikel auf dofactory , Wikipedia und vielen Websites zu lesen. Ich habe keine Ahnung von Unterschieden zwischen dem Brückenmuster und dem Strategiemuster.

Ich weiß, dass beide eine Abstraktion von ihrer Implementierung entkoppeln und die Implementierung zur Laufzeit ändern können.

Aber ich weiß immer noch nicht, in welcher Situation ich Strategie anwenden oder in welcher Situation Bridge anwenden soll.

109
Krirk

Semantik. Aus Wikipedia :

Das UML-Klassendiagramm für das Strategy-Muster ist dasselbe wie das Diagramm für das Bridge-Muster. Diese beiden Entwurfsmuster stimmen jedoch in ihrer Absicht nicht überein. Während das Strategiemuster für das Verhalten gedacht ist, ist das Brückenmuster für die Struktur gedacht.

Die Kopplung zwischen dem Kontext und den Strategien ist enger als die Kopplung zwischen der Abstraktion und der Implementierung im Bridge-Muster.

Soweit ich weiß, verwenden Sie das Strategiemuster, wenn Sie Verhalten abstrahieren, das von einer externen Quelle bereitgestellt werden könnte (z. B. könnte config angeben, dass eine Plugin-Assembly geladen werden soll), und Sie verwenden das Bridge-Muster, wenn Sie es verwenden die gleichen Konstrukte, um Ihren Code ein bisschen ordentlicher zu machen. Der eigentliche Code wird sehr ähnlich aussehen - Sie wenden die Muster nur aus leicht unterschiedlichen Gründen an .

62
Kent Boogaart

Das Brückenmuster ist ein Strukturmuster (WIE ERSTELLEN SIE EINE SOFTWAREKOMPONENTE?). Das Strategiemuster ist ein dynamisches Muster (WIE MÖCHTEN SIE EIN VERHALTEN IN SOFTWARE AUSFÜHREN?).

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

  • Strategie : Sie haben mehr Möglichkeiten, eine Operation durchzuführen; Mit Strategy können Sie den Algorithmus zur Laufzeit auswählen und eine einzelne Strategy ohne viele Nebenwirkungen zur Kompilierungszeit ändern.
  • Bridge : Sie können die Hierarchie von Interface und Klasse aufteilen und mit einem abstrakten Verweis verbinden (siehe Erläuterung )
53
alepuzio

Strategie:

  • Mit der Strategie verbundener Kontext: Die Kontextklasse (möglicherweise Abstract, aber nicht wirklich eine Schnittstelle! Sie möchten ein bestimmtes Verhalten und nicht die gesamte Implementierung zusammenfassen) würde die Strategie-Schnittstellenreferenz und Implementierung kennen/enthalten = um das Strategieverhalten darauf aufzurufen.
  • Absicht ist die Fähigkeit, das Verhalten zur Laufzeit auszutauschen

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

Brücke

  • Abstraktion ist nicht an die Implementierung gebunden: Die Abstraktionsschnittstelle (oder abstrakte Klasse mit den meisten abstrakten Verhaltensweisen) würde die Referenz auf die Implementierungsschnittstelle nicht kennen/enthalten
  • Es ist beabsichtigt, die Abstraktion vollständig 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();
    
          }
    
          .............
    
    }
    
10
MEER

Brücke : (Ein Strukturmuster)

Bridge-Pattern entkoppelt Abstraktion und Implementierung und erlaubt es, beide unabhängig voneinander zu variieren.

Verwenden Sie dieses Muster, wenn:

  1. Abstraktionen und Implementierungen wurden zum Zeitpunkt der Kompilierung noch nicht entschieden
  2. Abstraktionen und Implementierungen sollten unabhängig voneinander geändert werden
  3. Änderungen in der Implementierung der Abstraktion sollten sich nicht auf die Aufruferanwendung auswirken
  4. Der Kunde sollte von den Implementierungsdetails isoliert sein.

Strategie: (Verhaltensmuster)

Mit Strategiemustern können Sie zur Laufzeit zwischen mehreren Algorithmen aus einer Reihe von Algorithmen wechseln.

Verwenden Sie ein Strategiemuster, wenn:

  1. Es sind mehrere Versionen von Algorithmen erforderlich
  2. Das Verhalten der Klasse muss zur Laufzeit dynamisch geändert werden
  3. Vermeiden Sie bedingte Anweisungen

Zusammenhängende Posts:

Wann verwenden Sie das Bridge-Pattern? Wie unterscheidet es sich vom Adapter-Pattern?

Beispiel aus der Praxis des Strategiemusters

8
Ravindra babu

Das habe ich auch gedacht, aber kürzlich musste ich mit bridge feststellen, dass bridge eine Strategie verwendet und dem Kontext eine Abstraktion hinzufügt, damit Sie später weitere Änderungen vornehmen können, ohne den Client zu ändern. Wenn Sie Strategy ohne die Abstraktion verwenden, ist das Design nicht so flexibel und erfordert möglicherweise spätere Änderungen am Client. Bei Verwendung der gesamten Brücke wird das Design jedoch noch flexibler. Hier können Sie sehen, wie der Übergang von Strategy zu Bridge mehr Flexibilität bietet. Wir gehen auch davon aus, dass "visa" und "master" jetzt nicht nur auf Karten, sondern auch auf Handys und Chips verfügbar sind. und wenn wir Bridge verwenden, ist es viel einfacher, diese Unterstützung hinzuzufügen.

Strategy VS Bridge

5
Orhan

Entwurfsmustertypen

  • Verhalten: Muster charakterisieren die Art und Weise, wie Klassen oder Objekte interagieren und Verantwortung verteilen
  • Strukturell: Muster befassen sich mit der Zusammensetzung von Klassen oder Objekten.
  • Creational: Muster sind besorgt über den Prozess der Objekterstellung.

Brücke (Strukturell)

Entkoppeln Sie eine Abstraktion von ihrer Implementierung, sodass jede davon variieren kann. unabhängig. enter image description here

Nimm eine Fernbedienung. Die Fernbedienung hat die Tasten 1-6. Dies ist die konkrete Klasse im obigen Diagramm. Jede Taste funktioniert anders, je nachdem, ob die Fernbedienung für ein Fernsehgerät oder eine DVD verwendet wird. Die Funktionalität für jede Schaltfläche wird von der Implementierungsschnittstelle von der Implementierung abstrahiert.

Auf diese Weise können wir für jedes Gerät die Funktionsweise der Fernbedienung ändern.

Strategie (Verhalten)

Definieren Sie eine Familie von Algorithmen, kapseln Sie sie und machen Sie sie austauschbar. enter image description here

In der Strategie, wenn wir das entfernte Szenario betrachten. Der "Zustand" ist die gesamte Fernbedienung, die wir durch Ändern der Zustandsreferenz des Kontexts austauschen. Die "concreteStateA" (TV-Fernbedienung) "concreteStateB" (DVD-Fernbedienung).

Zusätzliche Lektüre:

3
Daniel

Wenn Sie die Antwort von willcodejavaforfood ergänzen, können sie in der Implementierung identisch sein. Sie verwenden jedoch Strategie, um Strategien wie Sortierstrategie auszutauschen, während Sie Bridge verwenden, um die Implementierungen von zwei Objekten, beispielsweise einem Datenbank-Wrapper und einem Netzwerkadapter, zu überbrücken, sodass der Client-Code entweder für dieselbe API verwendet werden kann. Die Benennung sagt also eigentlich schon alles

2
Robert Gould
  1. Strategie Muster wird für Verhaltensentscheidungen verwendet, während Brücken Muster verwendet wird Strukturelle Entscheidungen.

  2. Brigde Pattern trennt die abstrakten Elemente von den Implementierungsdetails, während Strategy Pattern befasst sich damit, Algorithmen austauschbarer zu machen.

Strategiemuster in UML

Brigde Pattern in UML

Strategiemuster 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 Pattern 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()
2
Joan Disho

Nur um das zu ergänzen, was bereits über den Mustervergleich gesagt wurde (Unterschied der Absichten, ...): Das Brückenmuster ist auch absichtlich so strukturiert, dass die Abstraktionshierarchieseite variieren kann. In Sprachen wie C # könnte dies bedeuten, dass Sie über eine Abstraktionsbasis verfügen, die virtuelle Methoden enthält, um beabsichtigte Variationen zuzulassen, die für vorhandene Verbraucher keine Probleme verursachen. Davon abgesehen scheinen die beiden Muster zum größten Teil identisch zu sein.

1
Burt

Aus dem Wiki auf Strategie Muster

Das UML-Klassendiagramm für das Strategy-Muster ist dasselbe wie das Diagramm für das Bridge-Muster. Diese beiden Entwurfsmuster stimmen jedoch in ihrer Absicht nicht überein. Während das Strategiemuster für das Verhalten gedacht ist, ist das Brückenmuster für die Struktur gedacht.

Die Kopplung zwischen dem Kontext und den Strategien ist enger als die Kopplung zwischen der Abstraktion und der Implementierung im Bridge-Muster.

1

Das Strategiemuster wird verwendet, wenn Sie den Algorithmus oder die Strategie zur Laufzeit einbinden möchten. Als Kategorie des Musters gilt auch, dass es sich um das Verhalten der Objekte handelt. Auf der anderen Seite ist bridge ein strukturelles Muster und befasst sich mit der strukturellen Hierarchie der Objekte. Es entkoppelt die Abstraktion von der Implementierung, indem es eine verfeinerte Abstraktion zwischen ihnen einführt. Verfeinerte Abstraktion kann mit der eingesteckten Laufzeitstrategie verwechselt werden (In Strategy-Muster). Das Brückenmuster befasst sich mit den strukturellen Aspekten, indem ein Mechanismus bereitgestellt wird, mit dem vermieden wird, dass n Klassen erstellt werden.

1
Pranav Sharma

Für das Strategiemuster variiert nur die Implementierung.

Angenommen, Klasse A verwendet Klasse B, für die mehrere Implementierungen verfügbar sind. In diesem Fall wäre B also abstrakt mit der tatsächlichen Implementierung, die zur Laufzeit bereitgestellt wird. Dies ist ein Strategiemuster

Nun, wenn A selbst abstrakt ist. Sowohl A als auch B können variieren. Sie würden Bridge-Muster verwenden.

0
Ritesh Tyagi

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

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

IMO ist das Strategiemuster einfacher oder flacher. Es dient der OCP mit Sicherheit, muss aber nicht unbedingt Teil eines anderen und umfassenderen Konzepts wie dem Bridge-Muster sein.

0
stdout