设计模式 - 策略模式和桥接模式(设计上的重叠)

5
今天我的困惑来自于尝试理解为什么策略模式和桥接模式的实现方式存在重叠。以下是桥接模式(从抽象中抽象出一个实现):
// Shapes object structure will not be concerned how they draw themselves
public abstract class Shape {
   protected DrawAPI drawAPI;

   protected Shape(DrawAPI drawAPI){
     this.drawAPI = drawAPI;
   }
   // This could also be put in the subcla
   public void draw() {
     drawAPI.drawCircle(radius,x,y);
   }
}

现在介绍策略模式 - 一个类的行为或算法可以在运行时更改。计算器将把其操作委托给策略。
public class Calculator{
  private Strategy strategy;

  public Calculator(Strategy strategy){
    this.strategy = strategy;
  }

  public int executeStrategy(int num1, int num2){
     return strategy.doOperation(num1, num2);
  }
}

这两种模式都涉及到丢弃封装功能的策略对象。请帮忙清楚地区分桥接模式(结构型)和策略模式(行为型)。我感到困惑的另一个问题是它们属于知识的不同领域。

在桥接模式中,将抽象和实现分离,使它们可以独立变化。桥接模式可用于最初只有几个实现的情况下,以便通过添加新的实现进行扩展。策略模式则允许从一组算法中选择一个来完成特定任务。这两者之间的主要区别在于它们的目的:桥接模式旨在使抽象和实现分离,而策略模式旨在提供灵活性,并根据需要动态更改算法。


1
可能是策略模式与桥接模式的重复问题 - Lukasz_Plawny
1
https://dev59.com/Km025IYBdhLWcg3wr4B6, https://dev59.com/a3RB5IYBdhLWcg3w7riV - Andrew Tobilko
策略模式是一种行为模式,桥接模式是一种结构模式。请参阅https://dev59.com/a3RB5IYBdhLWcg3w7riV - Saulius Next
https://dev59.com/a3RB5IYBdhLWcg3w7riV - Tobi
3个回答

3
在你的例子中,我看到这两个模式之间有一点重叠。
第一种情况下,桥接模式用于将抽象与其实现解耦,以便两者可以独立变化。这就是说,您只是在抽象实现。
在第二种情况下,策略模式可以在运行时更改类的行为。这也意味着,在一个具体的策略类中,您也可以实现桥接模式,也许您正在使用一个类并希望解耦它。

1
策略模式指的是您可以稍后更改核心算法。例如,在编写电子商务应用程序时,您有B2B和B2C客户端,这些客户端具有不同的付款和订单方式。然后,您将使用策略模式进行结帐策略。因此,基本操作相同,但两个用户使用不同的方式(策略)来完成。相比之下,桥接模式表示您在两个模块之间构建了一座桥梁,可以独立更改这些模块。这针对的是抽象和信息隐藏。

0
桥接模式用于封装组件并暴露其他接口。当你使用一个生命周期不受你控制的组件时,通常会使用桥接模式。它限制了软件对桥接实现的依赖。
策略模式用于在执行某个操作时有多种可能的算法,并且你希望保持能够从一种算法切换到另一种算法的能力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接