我尝试阅读有关dofactory,维基百科和许多网站的许多文章.我不知道桥梁模式和战略模式之间的差异.
我知道它们都将抽象与其实现分离,并且可以在运行时更改实现.
但我仍然不知道在哪种情况下我应该使用策略或在哪种情况下我应该使用桥接器.
语义.来自维基百科:
策略模式的UML类图与Bridge模式的图相同.但是,这两种设计模式的意图并不相同.虽然策略模式适用于行为,但Bridge模式适用于结构.
上下文和策略之间的耦合比Bridge模式中的抽象和实现之间的耦合更紧密.
据我了解,当你抽象出可以从外部源提供的行为时(例如,config可以指定加载一些插件程序集),你正在使用策略模式,并且当你使用时你正在使用桥接模式相同的结构使你的代码更整洁.实际的代码看起来非常相似 - 你只是因为略有不同的原因而应用这些模式.
桥模式是一种结构模式(您如何构建软件组件?).策略模式是一种动态模式(您希望如何在软件中运行行为?).
语法类似,但目标不同:
策略:你有更多的方法来做手术; 使用策略,您可以在运行时选择算法,并且您可以在编译时修改单个策略而不会产生很多副作用;
Bridge:您可以拆分接口和类的层次结构,使用抽象引用将其连接起来(请参阅说明)
战略:
与策略绑定的上下文:上下文类(可能是抽象但不是真正的接口!因为您希望封装特定行为而不是整个实现)将知道/包含策略接口引用和实现以调用策略行为它.
Intent是在运行时交换行为的能力
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(); } ............. }
桥 :(结构模式)
桥接模式解耦抽象和实现,并允许两者独立变化.
使用此模式时:
抽象和实现尚未在编译时决定
抽象和实现应该独立更改
抽象实现的变化不应影响调用者应用程序
客户应与实施细节隔离.
策略:(行为模式)
策略模式使您可以在运行时从一系列算法中切换多个算法.
使用策略模式时:
需要多个版本的算法
必须在运行时动态更改类的行为
避免条件陈述
相关文章:
你什么时候使用桥模式?它与适配器模式有何不同?
战略模式的现实世界范例
我也有相同的想法,但是最近我不得不使用网桥,并意识到网桥正在使用策略并向上下文中添加抽象,以便您以后可以进行更多更改而无需更改客户端。当使用不带抽象的策略时,设计不那么灵活,以后可能需要更改客户端。但是,当使用整个桥时,设计将变得更加灵活。在这里,您可以了解如何从“战略”过渡到“桥梁”如何提供更大的灵活性。我们还假设现在不仅可以在卡上使用“签证”和“主卡”,而且还可以在手机和芯片上使用“签证”和“主卡”。如果我们使用网桥,则添加该支持要容易得多。