Answers:
语义学。来自维基百科:
Strategy模式的UML类图与Bridge模式的图相同。但是,这两种设计模式的意图并不相同。策略模式用于行为,而桥接模式用于结构。
上下文和策略之间的耦合比桥接模式中抽象和实现之间的耦合更紧密。
据我了解,当您抽象可能由外部来源提供的行为时,您正在使用策略模式(例如config可以指定加载某些插件程序集),而当您使用相同的构造使您的代码更加整洁。实际的代码看起来非常相似-您只是出于稍微不同的原因应用模式。
桥接模式是一种结构模式(您如何构建软件组件?)。策略模式是动态模式(您如何在软件中运行行为?)。
语法相似,但目标不同:
战略:
目的是在运行时交换行为的能力
class Context {
IStrategy strategyReference;
void strategicBehaviour() {
strategyReference.behave();
}
}
桥
目的是使抽象与实现完全脱钩
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();
}
.............
}
桥:(一种结构模式)
桥接模式将抽象和实现解耦,并允许两者独立变化。
在以下情况下使用此模式:
策略:(行为模式)
策略模式使您可以在运行时在一系列算法中的多种算法之间进行切换。
在以下情况下使用策略模式:
相关文章:
设计模式类型
桥梁(结构)
拿一个遥控器。遥控器具有按钮1-6。这是上图中的具体类。每个按钮的作用会有所不同,具体取决于遥控器是用于电视还是DVD。每个按钮的功能都是通过实现者接口从实现中抽象出来的。
这使我们可以更改遥控器在每种设备上的工作方式。
策略(行为)
在策略上,如果我们正在研究远程方案。“状态”是我们通过更改上下文的状态引用交换出来的整个远程对象。“ concreteStateA”(电视遥控器)“ concreteStateB”(DVD遥控器)。
补充阅读:
策略模式用于行为决策,而桥接模式用于结构决策。
Brigde Pattern从实现细节中分离出抽象元素,而Strategy Pattern则关注使算法更具互换性。
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")
Swift中的Brigde模式:
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()
Stereo
与进行交换即可TV
使代码正常工作。
来自策略模式的维基
Strategy模式的UML类图与Bridge模式的图相同。但是,这两种设计模式的意图并不相同。策略模式用于行为,而桥接模式用于结构。
上下文和策略之间的耦合比桥接模式中抽象和实现之间的耦合更紧密。
对于策略模式,仅实现方式有所不同。
假设类A使用的类B具有多种可用实现。因此,在那种情况下,B将是抽象的,并在运行时提供了实际的实现。这是策略模式
现在,如果A本身是抽象的。A和B可能都不同。您将使用桥接模式。