Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 战略与桥梁模式_Oop_Design Patterns_Strategy Pattern_Bridge - Fatal编程技术网

Oop 战略与桥梁模式

Oop 战略与桥梁模式,oop,design-patterns,strategy-pattern,bridge,Oop,Design Patterns,Strategy Pattern,Bridge,我知道以前有人问过这个问题(例如,) 然而,请有人用明确的例子解释一下,两者的区别是什么,在什么样的情况下,必须选择一个而不是另一个?少一些概念性的理论,多一些实际的“现实生活”场景是值得赞赏的。让我背诵相关问题的答案 桥接模式是一种结构模式,也就是说,它列出了如何构建项目组件的想法。它用于隐藏两级抽象。维基百科上的示例代码(http://en.wikipedia.org/wiki/Bridge_pattern)用最明确的术语解释它 战略模式是一种动态模式。当任何野生功能都可以实现需求时,就会使

我知道以前有人问过这个问题(例如,)


然而,请有人用明确的例子解释一下,两者的区别是什么,在什么样的情况下,必须选择一个而不是另一个?少一些概念性的理论,多一些实际的“现实生活”场景是值得赞赏的。

让我背诵相关问题的答案

桥接模式是一种结构模式,也就是说,它列出了如何构建项目组件的想法。它用于隐藏两级抽象。维基百科上的示例代码(http://en.wikipedia.org/wiki/Bridge_pattern)用最明确的术语解释它

战略模式是一种动态模式。当任何野生功能都可以实现需求时,就会使用策略模式。示例可以是允许开发和安装插件的任何程序。在维基百科网页上(http://en.wikipedia.org/wiki/Strategy_pattern)、ConcreteStrategyAdd、ConcreteStrategySubtract等是ConcreteStrategy类中使用的插件。这里可以使用任何实现接口策略的方法。

策略模式 此模式允许执行的算法独立于使用它的客户端而变化。i、 e.它不需要为给定的情况执行固定的算法,而是允许在运行时动态选择许多算法中的一个。这涉及到从其宿主类中删除一个算法并将其放在一个单独的类中

例如,假设一个人想从一个城市旅行到另一个城市,那么他有几个选择:乘公共汽车、租车、赶火车等等。因此,所选择的每种交通方式都会被转换成一个单独的算法来执行。选择的运输方式将取决于运行时决定的各种因素(成本、时间等)。换言之,选择执行的策略将在运行中决定

另一个例子是,假设想要实现一个
SortedList
类(主控制器),该类基于
策略对
进行排序。该策略是用于排序的方法(如MergeSort、QuickSort)

与桥梁型式的比较 主要区别(尽管两种模式具有相同的UML)是,与桥接模式(一种结构模式)不同,策略模式是一种行为模式。结构模式表示组成、关联或继承对象以形成更大对象的方式,即它们关注对象组成。行为模式处理算法或业务逻辑(而不是对象创建本身),也就是说,它们关注对象之间的协作

请注意,大多数算法可以实现为静态类或单例类,只需要创建单个实例(即,并非每次设置策略时都调用
new

仔细观察这两种模式的实现将发现,在桥接模式中,一个创建对象的具体实现,然后创建调用

// Set implementation and call
// i.e. Returns (creates) the concrete implementation of the object, 
// subsequently operation is called on the concrete implementation
ab.Implementor = new ConcreteImplementorA(); 
ab.Operation();
然而,在策略模式的情况下,人们不会直接使用算法的具体实现,而是会创建执行策略的上下文

// Set the context with a strategy
// i.e. Sets the concrete strategy into the context, concrete implementation of the class not 
// directly available as a data object (only the algorithm is available).    
context = new Context (new ConcreteStrategyA());     
context.contextInterface();

// Strategy can be reused instead of creating a new instance every time it is used.
// Sort example
MergeSort mergeSort = new MergeSort();
QuickSort quickSort = new QuickSort();
...
context = new Context (mergeSort);
context.Sort();
...
context = new Context (quickSort);
context.Sort();
...
context = new Context (mergeSort);
context.Sort();

桥接模式对抽象和实现进行了区分,两者可以独立变化。我将使用

Java模式,第1卷:用UML说明的可重用设计模式目录,第二版

您需要提供访问物理传感器的类,如天平、速度测量设备等。每个传感器产生一个数字,但数字可能意味着不同的事情。对于磅秤,它可能表示重量;对于测速装置,它可能表示速度

因此,您可以从创建传感器抽象类开始,以表示所有传感器和不同类型传感器的不同子类之间的共性。这是一种稳健的设计,允许您在未来提供更多类型的传感器

现在假设传感器由不同的制造商提供。您必须为制造商X和制造商Y创建传感器类的继承人。现在的问题是,客户需要知道制造商之间的差异。如果你决定支持第三家制造商

解决方案是提供主要的抽象继承权,即传感器抽象类和子类,如SpeedSensor和WeightSensor等。然后提供抽象和实现之间的接口(桥)。因此将有一个SensorInterface、WeightSensorInterface和SpeedSensorInterface,它规定了每个具体传感器类必须提供的接口。抽象不知道实现,而是知道接口。最后,您可以为每个制造商创建一个concreate实现。即X传感器、X重量传感器和X速度传感器、Y传感器、Y速度传感器和Y重量传感器

客户机只依赖于抽象,但任何实现都可以插入。因此,在这个设置中,可以在不更改任何具体类的情况下更改抽象,也可以在不担心抽象的情况下更改实现

如您所见,这描述了一种构造类的方法

另一方面,该策略涉及在运行时更改对象的行为。我喜欢使用一个游戏的例子,其中一个角色拥有几种不同类型的武器。角色可以攻击,但攻击行为取决于角色当时持有的武器,这在编译时是未知的

因此,您可以使武器行为可插入,并根据需要将其注入角色。因此形成了一种行为模式

这两种模式解决不同的问题。该战略涉及制定alg
class Sorter abstract
{ 
   virtual void Sort() = 0;
}

// MergeSorter IS A Sorter
class MergeSorter : public Sorter
{
   virtual void Sort() override;
}
class SortStrategy abstract
{
   virtual void Sort() = 0;
}

// Sorter HAS A SortStrategy
class Sorter
{ 
   Sorter(SortStragety *strategy) : mStrat(strategy) {}

   void Sort() {mStrat->Sort();}

   SortStrategy *mStrat;
}