复合模式实现

时间:2012-01-08 00:13:04

标签: java design-patterns composite

我正在编写一个涉及复合模式的代码,并希望得到一些澄清。我有超级经理,主要经理和普通经理,他们处于下降层次,超级经理位于顶层。

我希望超级经理能够给总经理一些钱,主经理能够给普通经理一些钱。我遇到的问题是我不希望Main Manager能够给Super Manager一些钱,而且我不想使用instanceof来确保它,因为它违背了Composite模式的目的。

我的主经理和普通经理扩展了一个名为gradeManagers的抽象类,而我的超级管理器有一个数组列表,可以添加类型为gradeManagers的组件。

3 个答案:

答案 0 :(得分:5)

听起来您的层次结构非常适合复合模式。 Composite模式旨在允许以与单个对象相同的方式处理对象集合。 (想想零件用螺栓固定在一起。有时你想把一个子组件想象成一个可以与其他零件/子组件螺栓连接在一起的零件。子组件是复合材料。)如果我明白你是什么尝试这样做时,您没有要将其视为另一个Manager的Manager对象集合。

尽管如此,无论你是否使用Composite,我建议添加一个属性(让我们称之为depth),随着你走下层次结构而增加。然后,您可以使用它来实现您的业务规则:经理只能向另一个具有相同或更高深度的经理提供资金。这允许您以避免任何对象类概念的方式进行编码。

答案 1 :(得分:1)

正如Ted Hopp已经提到的那样,这听起来不像是你使用复合模式的东西。这听起来像是polymorphism的情况。

当您希望将一组项目视为一个项目时,应使用复合模式。考虑一个绘图程序,您可以在屏幕上放置形状,可以是三角形,正方形等。现在,考虑一下您可以更改这些形状的背景颜色的功能。如果你想改变多个形状的背景颜色,你想要做这样的事情

interface Shape {
    public void setBackgroundColor(Color c);
}

在您的实际实施代码中:

 for (Shape s : selectedShapes)
     s.setBackgroundColor(c);

您可以使用复合模式,而不是在代码中执行此操作。这使得您的实现代码完全无视您要编辑的“形状”实际上是多个形状的事实,并允许您的应用程序将其视为任何其他形状。

class CompositeShape implements Shape
{
    public void setBackgroundColor(Color c);
    for (Shape s : Shapes)
        s.setBackgroundColor(c);
}

class TriangleShape implements Shape { ... }
class SquareShape implements Shape { ... }

答案 2 :(得分:0)

我会延长@Ted Hopp的答案,并建议不要使用年级而不是深度。这可能更接近您正在使用的域。既然你已经指出你有分级经理,这可能是一个优雅的解决方案。

希望有所帮助。