有什么区别之间的桥模式和战略的模式?
-
19-08-2019 - |
题
我试图阅读了许多文章 dofactory, 维基百科和许多网站。我没有思想上的差异之间的桥模式和战略的模式。
我知道他们俩的分抽象,从其执行情况,并可能改变执行在运行时间。
但我仍然不知道在这种情况下,我应该使用的策略或者在这种情况下,我应该使用的桥梁。
解决方案
语义。从维基百科:
的策略的UML类图 图案是一样的图对 桥接模式。然而,这两个 设计模式是不一样 他们的意图。虽然战略 模式是为行为时, 桥图案是指用于结构。
上下文和之间的耦合 策略比更紧 抽象和之间的耦合 在桥的实现 图案。
据我所知,您使用的,当你抽象,可以从外部源提供的行为策略模式(例如,配置可以指定加载一些插件组件),并且所使用的桥接图案当您使用相同的结构,使你的代码有点整洁。实际的代码看起来非常相似 - 你只是应用模式对于稍微不同的原因
其他提示
桥模式是一个结构模式(你如何建立一个软件组成部分?).该战略的模式是一个动态的模式(如何做你想要跑的行为在软件吗?).
法是相似的,但目标是不同的:
- 战略:你有更多的方法进行操作;与的战略,可以选择的算法在运行时间你可以修改一个单一的战略没有一个很大的副作用在编译时间;
- 桥:你可分割的层次结构的界面和阶级,加入它与一个抽象的参考(见 解释)
战略:
- 背景下捆绑的战略:上下文类(可能是抽象的,但不是一个真正的接口!为妳想要封装出一个具体的行为,并不是整个实施)会知道/包含在战略口参与 执行情况 援引的战略行为。
意图是能够交换的行为在运行时
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(); } ............. }
桥: (一结构模式)
桥模式分离抽象和实施,并允许两者有所不同。
使用这一模式时:
- 抽象和实现尚未决定在编制时间
- 抽象概念和实施方式应当独立地改变
- 改变执行情况的抽象应该不会影响来电应用
- 客户应该是绝缘执行情况的详细信息。
战略: (行为模式)
战略的模式,使你能够换个算法从一个家庭的算法在运行时间。
使用战略的模式如下:
- 多个版本的算法是必需的
- 该行为的类已经被改变的动态运行的时间
- 避免有条件的声明
相关的员额:
添加到willcodejavaforfood的答案,他们可以是相同的,在执行。但是你用的策略交换策略,如排序策略,当你使用网桥桥接两个目标的实现我们说一个数据库包装和网络适配器,使客户端代码可以使用针对相同的API工作。所以命名居然说,这一切
战略 图案是用于行为的决定的同时 桥 图案是用于结构的决定。
桥 模式separats的抽象要素的执行情况的详细信息,同时 战略 图案感到关切的是做的算法更可以互换的。
战略模式在迅速:
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")
桥模式在迅速:
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()
从上策略图案
的策略的UML类图 图案是一样的图对 桥接模式。然而,这两个 设计模式是不一样 他们的意图。虽然战略 模式是为行为时, 桥图案是指用于结构。
上下文和之间的耦合 策略比更紧 抽象和之间的耦合 在桥的实现 图案。
我想补充一下已经说过,关于模式的比较(意向性差,...):桥接模式也有意结构,使抽象的层次结构方面发生变化。在如C#语言中,这可能意味着你有一个包含虚拟方法的方式,让不会导致现有消费者的问题预期变化的抽象的基础。除了这两个图案可能出现在大多数情况下是相同的。
当希望在运行时堵塞算法或策略策略模式被使用。作为图案的类别还意味着它与物体的行为交易。在另一方面桥结构模式,并与对象的结构层次交易。它通过引入它们之间的精致的抽象解耦实施抽象。精致的抽象可以混同插入(在策略模式)运行时的策略。桥图案通过提供一种机制,以避免创建的类的n个与该结构方面的交易。
有关策略模式仅执行而变化。
假设,类A被使用具有可用的多个实现B类。因此,在这种情况下,B将是抽象的在运行时提供的实际执行情况。这是策略模式
现在,如果A本身是抽象的。 A和B两者可以变化。你会使用桥接模式。
我觉得有一个在他们正在使用的背景下它们之间的微小差异。
我使用桥接模式来分离它们都属于一个更大的正交的概念 - 让他们独立地改变。它通常涉及多个抽象。
IMO,策略模式是更简单或更平坦的。它用于OCP肯定,但并不一定要的另一部分和更大的概念象桥接模式。