1

我对使用哪种模式来设计以下场景感到困惑,

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

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

现在我想将 DualClutchGearBox 添加到层次结构中。以前的所有变速箱都是单离合器。我该怎么做呢?

带装饰器 -->

DualClutchDecorator implements GearBox{
     DualClutchDecorator(GearBox box){...}
}

带桥 -->

GearBox{
   GearBoxImpl impl;
   ....
}

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

abstract class GearBoxImpl{}
SingleClutchImpl extends GearBoxImpl{...}
DualClutchImpl extends GearBoxImpl{...}

哪个更好,为什么?

4

3 回答 3

5

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

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

于 2012-11-10T20:21:30.060 回答
3

我不确定我会使用这两种模式中的哪一种。您是否有理由不想只创建第三个具体类?

当您需要动态更改行为时,您可以使用装饰器。我能想到的主要示例之一是 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)));

所以装饰器的想法是我可以通过添加装饰器来改变运行时的行为。根据我的理解,这不是你想要做的。DualClutch 将表现出特定的行为,无需即时更改它。

我也没有从 Bridge 看到一个很好的案例,但我想这取决于你的具体情况。就像我说的,DualClutch 似乎只有静态行为,而汽车要么有,要么没有。似乎一个简单的具体类就可以了。

于 2012-11-10T21:24:58.557 回答
1

这取决于。

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

请记住,自动变速箱和手动变速箱在现实中并没有完全相同的功能,因此无论如何可能不会共享相同的界面(例如,您可以在手动变速箱中直接从第 5 档换到第 3 档,但在大多数情况下不是汽车 - 并且汽车可能具有手动变速箱不需要的降档功能)。

相反,双离合变速箱在接口方面可能与单离合变速箱没有区别,仅在实施上有所不同。

于 2012-11-10T20:04:51.753 回答