桥梁模式和战略模式之间有什么区别?

Kri*_*irk 111 design-patterns bridge strategy-pattern

我尝试阅读有关dofactory,维基百科和许多网站的许多文章.我不知道桥梁模式和战略模式之间的差异.

我知道它们都将抽象与其实现分离,并且可以在运行时更改实现.

但我仍然不知道在哪种情况下我应该使用策略或在哪种情况下我应该使用桥接器.

Ken*_*art 62

语义.来自维基百科:

策略模式的UML类图与Bridge模式的图相同.但是,这两种设计模式的意图并不相同.虽然策略模式适用于行为,但Bridge模式适用于结构.

上下文和策略之间的耦合比Bridge模式中的抽象和实现之间的耦合更紧密.

据我了解,当你抽象出可以从外部源提供的行为时(例如,config可以指定加载一些插件程序集),你正在使用策略模式,并且当你使用时你正在使用桥接模式相同的结构使你的代码更整洁.实际的代码看起来非常相似 - 你只是因为略有不同的原因而应用这些模式.

  • 所以我可以说我正在使用策略模式来抽象行为,同时也使代码看起来像在桥模式中更整洁..或者,我使用Bridge模式使代码更整洁,也因为它允许我如策略模式中的抽象行为?我会是对的吗? (3认同)
  • [桥的UML(http://www.plantuml.com/plantuml/img/bL4nRiCm3Dpv2i9Tx24VI0C3iG47cGfqBJeeDfqAbKH3OWSZyDyhstMX1XtQJUJnU7UYQ364bTVTbJ0_SLD0UDTkK5vP3396C8ZNhNnO0s-w8oGxo8YMx8Ly07M9i6e5MwD2mEDNgTdX3H2V1l9ghl829d0iX8PwGUxJqVq-dTDss9NVZRCTyk8Ho7Kuqs7LUQPUE-fIkKWpPCd9lOi9G3iXtwkMyBnDiLyCthO04_wKZBHLgcRNUX9AcCTKx7xZtzTK_re3QQeiCZFaNPdoO3rGY5c9PHmeEUMyifwDLEmxyZKRzeT3mroM-73rD6vumqv-GRSOMMrq5CjGnKZBSvkRFthjuEvb8Rr6UudfJm00)是相当不同的****我GoF的书的副本.[此工具](http://users.encs.concordia.ca/~nikolaos/pattern_detection.html)能够区分Bridge和Strategy. (3认同)
  • 我得到的方式是,使用相同的技术来抽象实现(策略)或抽象接口(桥)。策略交换行为,桥接交换接口(这最终允许交换具有此类接口的实现)。换句话说,Bridge在一侧创建标准化接口,而在另一侧插入具有不同接口的实现。 (2认同)

ale*_*zio 53

桥模式是一种结构模式(您如何构建软件组件?).策略模式是一种动态模式(您希望如何在软件中运行行为?).

语法类似,但目标不同:

  • 策略:你有更多的方法来做手术; 使用策略,您可以在运行时选择算法,并且您可以在编译时修改单个策略而不会产生很多副作用;
  • Bridge:您可以拆分接口和类的层次结构,使用抽象引用将其连接起来(请参阅说明)

  • 因此,如果语法相似,我会说我正在使用这些模式中的任何一种以特定方式运行软件行为,而且因为我想以这种方式构建组件,所以它看起来也很整洁? (3认同)

小智 11

战略:

  • 与策略绑定的上下文:上下文类(可能是抽象但不是真正的接口!因为您希望封装特定行为而不是整个实现)将知道/包含策略接口引用和实现以调用策略行为它.
  • Intent是在运行时交换行为的能力

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 抽象不依赖于实现:抽象接口(或具有大部分行为抽象的抽象类)不会知道/包含实现接口引用
  • 意图是完全将抽象与实现分离

    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();
    
          }
    
          .............
    
    }
    
    Run Code Online (Sandbox Code Playgroud)


Rav*_*abu 9

:(结构模式)

桥接模式解耦抽象和实现,并允许两者独立变化.

使用此模式时:

  1. 抽象和实现尚未在编译时决定
  2. 抽象和实现应该独立更改
  3. 抽象实现的变化不应影响调用者应用程序
  4. 客户应与实施细节隔离.

策略:(行为模式)

策略模式使您可以在运行时从一系列算法中切换多个算法.

使用策略模式时:

  1. 需要多个版本的算法
  2. 必须在运行时动态更改类的行为
  3. 避免条件陈述

相关文章:

你什么时候使用桥模式?它与适配器模式有何不同?

战略模式的现实世界范例


Orh*_*han 5

我也有相同的想法,但是最近我不得不使用网桥,并意识到网桥正在使用策略并向上下文中添加抽象,以便您以后可以进行更多更改而无需更改客户端。当使用不带抽象的策略时,设计不那么灵活,以后可能需要更改客户端。但是,当使用整个桥时,设计将变得更加灵活。在这里,您可以了解如何从“战略”过渡到“桥梁”如何提供更大的灵活性。我们还假设现在不仅可以在卡上使用“签证”和“主卡”,而且还可以在手机和芯片上使用“签证”和“主卡”。如果我们使用网桥,则添加该支持要容易得多。

策略VS桥