桥接模式和策略模式有什么区别?

136
我尝试阅读了许多有关dofactory、维基百科和其他网站的文章,但我仍然不知道桥接模式和策略模式之间的区别。
我知道它们都将抽象与其实现分离,并可以在运行时更改实现。但是我仍然不知道在哪种情况下应该使用策略模式,在哪种情况下应该使用桥接模式。
15个回答

1

策略模式的维基百科中得知

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

在策略模式中,上下文和策略之间的耦合比桥接模式中抽象和实现之间的耦合更紧密。


1
你能详细说明最后一句话吗? - gstackoverflow

1

对于策略模式,只有实现不同。

假设类A正在使用类B,而类B有多种可用的实现。因此,在这种情况下,B将是抽象的,实际实现将在运行时提供。这就是策略模式。

现在,如果A本身是抽象的,则A和B都可能会变化。您将使用桥接模式。


0

我认为它们在使用的上下文中存在轻微的差异。

我使用桥接模式来分离正交概念,它们都属于一个更大的概念 - 让它们独立变化。通常涉及多个抽象。

在我看来,策略模式更简单或更扁平化。它确实用于OCP,但不一定是像桥接模式那样成为另一个更大的概念的一部分。


0
除了其他回答者解释的用例差异之外,还有一件事情需要考虑。

似乎BridgeStrategyTemplate method行为模式的组合。因此,我们按照Template method中的相同顺序调用方法,并根据给定的实现者更改其行为,就像Strategy模式一样。

这难道不意味着两种行为模式一起创建了一个结构模式吗?我们可以将Bridge模式用于行为方式吗?

0
在策略模式中,针对特定操作的“父类”活动是恒定的,而“子类”的活动可以变化。然而,在桥接模式中,父类和子类的活动都可以变化。
因此,例如,
public class Ticket {
    
    Date dateOfTravel;
    int distance;
    Vehicle vehicle;
    Seat  seat;
    
    public float getTotalFare(){
         //depends on 
               //Distance
               //Vehicle - whether Vehicle is AC or non-AC. 
               //Seat - based on the location of the Seat.
     
        //Fare = vehicleBaseFare*seatMultiplier*distance

    }
    
}

在上述情况中,变化取决于父级(距离)以及子级(车辆和座位)。因此,在这里,车辆和座位都像桥梁一样起到了作用。
现在,在这里。
public class Vehicle {

   TrackingDevice device;

   public Coordinates getCoordinates(){
       return device.getCoordinates();
   }
}

在这里,父类的角色是恒定的,也就是什么都没有做!因此,这就是一个策略模式。


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