【问题标题】:in a dilemma about which to use decorator vs bridge pattern在使用装饰器与桥接模式的困境中
【发布时间】:2012-10-30 19:15:45
【问题描述】:

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

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{...}

哪个更好,为什么?

【问题讨论】:

  • 这取决于DualClutchGearBox 需要如何不同于GearBox
  • 接口是一样的,只是换档时离合器的使用方式不同
  • 这是内部实现 - 它不会出现在界面中。这就是接口的全部意义所在。

标签: java design-patterns decorator bridge


【解决方案1】:

视情况而定。

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

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

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

【讨论】:

  • 我试图从制造商的角度来定义一切。
  • 在这种情况下,您不需要模拟变速箱的制造特性,而不是变速箱的驱动特性吗?
  • 假设我正在尝试计算几种变速箱类型的燃油里程/升数。
【解决方案2】:

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

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

【讨论】:

  • 您的回答是对桥接和装饰器模式的很好总结。非常有用。
【解决方案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 似乎只有静态行为,而汽车要么有,要么没有。似乎一个简单的具体类就可以解决问题。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2010-09-25
    • 2013-05-07
    • 2011-09-05
    • 2019-02-23
    • 1970-01-01
    • 2013-12-06
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多