Java 在使用装饰器与桥接器模式的两难选择中

Java 在使用装饰器与桥接器模式的两难选择中,java,design-patterns,decorator,bridge,Java,Design Patterns,Decorator,Bridge,我不知道使用哪种模式来设计以下场景 Interface GearBox { int upshift(); int downshift(); int reverse(); } AutoGearBox implements GearBox{...} ManualGearBox implements GearBox{...} 现在我想将双离合器变速箱添加到层次结构中。以前所有的变速箱都是单离合器的。我该怎么做呢 使用装饰器-> DualClutchDecorator implem

我不知道使用哪种模式来设计以下场景

Interface GearBox {
   int upshift();
   int downshift();
   int reverse();
}

AutoGearBox implements GearBox{...}
ManualGearBox implements GearBox{...}
现在我想将双离合器变速箱添加到层次结构中。以前所有的变速箱都是单离合器的。我该怎么做呢

使用装饰器->

DualClutchDecorator implements GearBox{
     DualClutchDecorator(GearBox box){...}
}
带桥->

GearBox{
   GearBoxImpl impl;
   ....
}

AutoGearBox implements GearBox{...}
ManualGearBox implements GearBox{...}

abstract class GearBoxImpl{}
SingleClutchImpl extends GearBoxImpl{...}
DualClutchImpl extends GearBoxImpl{...}
哪一个更好?为什么?这要看情况而定

您的接口是否从驱动程序的角度定义接口?你是不是在试图抽象出变速箱的共同特征——换档能力

请记住,在现实中,自动和手动变速箱的功能并不完全相同,因此可能不会共享相同的界面。例如,您可以在手动变速箱中直接阻止从第5档到第3档的换档,但在大多数汽车上不可以,而汽车可能具有手动变速箱不需要的强制降档功能

相反,双离合器变速箱在接口方面与单离合器变速箱可能无法区分,只是在实现上有所不同。

这取决于具体情况

您的接口是否从驱动程序的角度定义接口?你是不是在试图抽象出变速箱的共同特征——换档能力

请记住,在现实中,自动和手动变速箱的功能并不完全相同,因此可能不会共享相同的界面。例如,您可以在手动变速箱中直接阻止从第5档到第3档的换档,但在大多数汽车上不可以,而汽车可能具有手动变速箱不需要的强制降档功能


相反,双离合器变速箱在接口方面可能无法与单离合器变速箱区分,只是在实现上有所不同。

装饰器必须与想要装饰的对象的接口相匹配。记住这一点,您可以在不违反接口的情况下向装饰对象添加附加行为。请记住,装饰器的接口可以为对象提供额外的功能


另一方面,桥没有这个限制。面向客户机的接口可以不同于底层组件,并提供实现。它在客户端接口和实际实现之间形成了一座桥梁。

装饰器必须与要装饰的对象的接口相匹配。记住这一点,您可以在不违反接口的情况下向装饰对象添加附加行为。请记住,装饰器的接口可以为对象提供额外的功能


另一方面,桥没有这个限制。面向客户机的接口可以不同于底层组件,并提供实现。它在客户端接口和实际实现之间架起了一座桥梁。

我不确定我会使用这两种模式中的任何一种。你为什么不想创建第三个混凝土类呢

当需要动态更改行为时,可以使用Decorator。我能想到的一个主要例子是Java的InputStreamReader。我可以为我需要的任何情况编写一个修饰的阅读器,并且它们符合相同的界面

// I need to read lines from a file
Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// Or I want to read lines from a byte array and track the line numbers
Reader r = new LineNumberReader(new InputStreamReader(new ByteArrayInputStream(bytes)));
所以decorator的想法是,我可以通过添加decorator在运行时改变行为。据我所知,这不是你想要做的。双离合器将表现出特定的性能,无需在运行中进行更改


我也看不出布里奇有什么好案例,但我想这取决于你的具体案例。就像我说的,双离合器似乎只有静态特性,汽车要么有要么没有。似乎一个简单的具体类就可以做到这一点。

我不确定我会使用这两种模式中的任何一种。你为什么不想创建第三个混凝土类呢

当需要动态更改行为时,可以使用Decorator。我能想到的一个主要例子是Java的InputStreamReader。我可以为我需要的任何情况编写一个修饰的阅读器,并且它们符合相同的界面

// I need to read lines from a file
Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// Or I want to read lines from a byte array and track the line numbers
Reader r = new LineNumberReader(new InputStreamReader(new ByteArrayInputStream(bytes)));
所以decorator的想法是,我可以通过添加decorator在运行时改变行为。据我所知,这不是你想要做的。双离合器将表现出特定的性能,无需在运行中进行更改


我也看不出布里奇有什么好案例,但我想这取决于你的具体案例。就像我说的,双离合器似乎只有静态特性,汽车要么有要么没有。似乎一个简单的具体类就可以做到这一点。

这取决于Dual离合变速箱与变速箱需要有多大的不同。从界面上看,它是一样的,只是不同于它在更改齿轮时如何应用离合器。这是内部实现-它不会出现在界面中。这就是接口的全部要点。这取决于变速箱需要与变速箱有多大的不同。界面方面
它是一样的,只是不同于它在改变齿轮时如何应用离合器。这是内部实现——它不会出现在界面中。这就是接口的全部意义。我正试图从制造商的角度定义一切。在这种情况下,你不需要对变速箱的制造特征建模吗,不是变速箱的驱动特性?比如说,我试图计算几种变速箱类型的燃油里程/ltr。我试图从制造商的角度定义一切。在这种情况下,你不需要对变速箱的制造特性建模吗,不是变速箱的驱动特性吗?假设我正在计算几种变速箱类型的燃油里程/ltr。你的答案是桥和装饰模式的良好总结。非常有用。你的答案是桥和装饰图案的很好的总结。非常有用。