S. *_*ont 33 oop design-patterns bridge strategy-pattern
我知道之前已经问过这个问题(例如,桥梁模式和策略模式之间有什么区别?).
但是,有人可以使用明确的例子解释,区别的是什么,以及在哪种情况下必须选择另一种情况?更少概念理论,更实际的"现实生活"情景将不胜感激.
Vin*_*nie 40
Bridge Pattern以一种两者可以独立变化的方式区分抽象和实现.我将使用来自的示例
Java中的模式,第1卷:使用UML,第二版说明的可重用设计模式目录
您需要提供访问物理传感器的类,例如秤,速度测量设备等.每个传感器产生一个数字,但数字可能意味着不同的东西.对于秤,它可能意味着重量,对于速度测量装置,它可能意味着速度.
因此,您可以首先创建一个Sensor抽象类来表示所有传感器与不同类型传感器的各种子类之间的共性.这是一种强大的设计,允许您在将来提供更多类型的传感器.
现在假设传感器由不同的制造商提供.您必须为制造商X创建传感器类的层次结构,而为制造商Y创建另一个传感器级别.现在的问题是客户需要知道制造商之间的差异.如果你决定支持第三家制造商......?
解决方案是提供主要的抽象层次,即.传感器抽象类和子类,如SpeedSensor和WeightSensor等.然后提供抽象和实现之间将存在的接口(Bridge).因此,将有一个SensorInterface,WeightSensorInterface和SpeedSensorInterface,它们指示每个具体传感器类必须提供的接口.抽象不知道实现,而是知道接口.最后,您可以为每个制造商创建一个concreate实现.即XSensor,XWeightSensor和XSpeedSensor,YSensor,YSpeedSensor和YWeightSensor.
客户端仅依赖于抽象,但可以插入任何实现.因此,在此设置中,可以在不更改任何具体类的情况下更改抽象,并且可以在不担心抽象的情况下更改实现.
如您所见,这描述了一种构建类的方法.
另一方面,策略涉及在运行时更改对象的行为.我喜欢使用具有几种不同类型武器的角色的游戏示例.角色可以攻击,但是攻击的行为取决于角色当时持有的武器,而这在编译时是不可知的.
因此,您可以将武器行为设为可插入,并根据需要将其注入角色.因此,行为模式.
这两种模式解决了不同的问题.该策略涉及使算法可互换,而Bridge涉及将抽象与实现分离,以便您可以为同一抽象提供多个实现.也就是说,桥梁涉及整个结构.
以下是一些可能有用的链接:
tod*_*dmo 30
我可以说这很难解释.许多使用它并理解它的人很难向新手解释它.
对于像我这样在类比方面思考的人:
所以策略是一种一维的概念.想想一个可供选择的一维策略.
策略模式就像一个水管工,他拥有各种工具来疏通管道.每次工作都是一样的; 它是疏通管道的.但他选择完成这项工作的工具可能因情况而异.也许他会尝试一个,如果这不起作用,他会尝试另一个.
在这个类比中,"疏通管道"是实施其中一个策略的方法.Snake brush,power auger和draino是具体的策略,管道工是包含该方法的类(在大多数图中标记为"Context").
或者您可以想到多位螺丝刀上的可互换位.它们应该在运行时更换,以适应手头的工作,这就是搞砸了.

所以桥梁是一个二维概念.可以想象一个维度(行)是需要实现的方法列表,第二个维度(列)是实现这些方法中每个方法的实现者.
桥接模式就像一个人可以通过多种方式进行通信(电子邮件,文本,谷歌语音,电话,Skype)以及可以通过各种方式进行通信的许多设备 - PC,平板电脑和智能设备电话.
通信的各种方式(电子邮件,文本,电话)将是抽象接口上的方法,我们称之为"CommunicationDevice".在这种模式中,CommunicationDevice是实现者.这个类比中的每个设备(PC,平板电脑,智能手机)都是ConcreteImplementor,它实现了所有这些方法(电子邮件,文本,电话).
桥的另一个现成例子是Windows的odbc或oledb数据库驱动程序模块.它们都在相同的标准"数据库驱动程序"接口上实现各种方法,但它们以不同的方式实现该接口.即使你使用相同的数据库,比如Sql Server,仍然有不同的驱动程序可以与Sql Server通信,尽管有不同的方式.
