2012-11-10 41 views
1

我感到困惑的使用来设计以下场景哪种模式,左右为难哪些使用装饰VS桥模式

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

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

现在我想DualClutchGearBox添加到hierarchy.All以前的变速箱是单离合器。我该如何去做呢?

随着装饰 - >

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

随着大桥 - >

GearBox{ 
    GearBoxImpl impl; 
    .... 
} 

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

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

哪一个更好,为什么?

+1

这取决于'DualClutchGearBox'如何不同于'GearBox'。 –

+0

接口方面它是一样的,它只是在变速时使用离合器的方式不同 – LoyalBanana

+0

所以这是内部实现 - 它不会出现在接口中。这就是接口的全部要点。 – DNA

回答

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))); 

所以装饰的想法是,我可以通过添加装饰在运行时更改的行为。根据我的理解,这不是你想要做的。双离合器将呈现出特定的行为,不需要动态改变它。

我没有看到来自Bridge的伟大案例,但我想这取决于您的具体情况。就像我说的那样,DualClutch似乎只是静态的行为,一辆汽车将拥有或不拥有它。看起来像一个简单的具体类会做的伎俩。

1

这取决于。

您的接口是否从驱动程序的角度定义了接口?你是否想要抽象出变速箱的共同特征(更换齿轮的能力!)?请记住,汽车和手动变速箱在现实中并不具备完全相同的功能,因此无论如何可能不会共享相同的接口(例如,您可以在手动变速箱中直接从第5档换档至第3档,但在大多数汽车上不行 - 而汽车可能会有一个不需要手动变速箱的降档功能)。相反,双离合器变速箱就其接口而言可能与单离合器变速箱不可区分,仅在实施方面不同。

+0

我想从制造商的角度来定义一切。 – LoyalBanana

+0

在这种情况下,您不需要对变速箱的*制造*功能进行建模,也不需要对变速箱的*驾驶*功能进行建模? – DNA

+0

假设我正在计算几种变速箱类型的燃油里程/升。 – LoyalBanana

5

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

另一方面桥梁没有这个限制。面向客户端的接口可能与底层的组件不同,并且正在提供实现。它构成了客户界面与实际实施之间的桥梁。

+0

你的答案是桥梁和装饰者模式的很好的总结。很有用。 – DecKno