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.
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 .
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:
Absicht ist die Fähigkeit, das Verhalten zur Laufzeit auszutauschen
class Context {
IStrategy strategyReference;
void strategicBehaviour() {
strategyReference.behave();
}
}
Brücke
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();
}
.............
}
Brücke : (Ein Strukturmuster)
Bridge-Pattern entkoppelt Abstraktion und Implementierung und erlaubt es, beide unabhängig voneinander zu variieren.
Verwenden Sie dieses Muster, wenn:
Strategie: (Verhaltensmuster)
Mit Strategiemustern können Sie zur Laufzeit zwischen mehreren Algorithmen aus einer Reihe von Algorithmen wechseln.
Verwenden Sie ein Strategiemuster, wenn:
Zusammenhängende Posts:
Wann verwenden Sie das Bridge-Pattern? Wie unterscheidet es sich vom Adapter-Pattern?
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.
Entwurfsmustertypen
Brücke (Strukturell)
Entkoppeln Sie eine Abstraktion von ihrer Implementierung, sodass jede davon variieren kann. unabhängig.
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.
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:
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
Strategie Muster wird für Verhaltensentscheidungen verwendet, während Brücken Muster verwendet wird Strukturelle Entscheidungen.
Brigde Pattern trennt die abstrakten Elemente von den Implementierungsdetails, während Strategy Pattern befasst sich damit, Algorithmen austauschbarer zu machen.
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()
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.
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.
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.
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.
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.