Java 复合模式实现

Java 复合模式实现,java,design-patterns,composite,Java,Design Patterns,Composite,我正在写一个包含复合模式的代码,希望得到一些澄清。我有超级经理,一个主经理和一个普通经理,他们的级别从高到低,超级经理在最高层 我希望超级经理能给总经理一些钱,总经理能给普通经理一些钱。我的问题是我不希望主管理器能够给超级管理器一些钱,我也不想使用instanceof来确保这一点,因为它违背了复合模式的目的 我的主管理器和普通管理器扩展了一个名为gradeManagers的抽象类,而我的超级管理器有一个数组列表,可以添加gradeManagers类型的组件。听起来您的层次结构并不适合复合模式。复

我正在写一个包含复合模式的代码,希望得到一些澄清。我有超级经理,一个主经理和一个普通经理,他们的级别从高到低,超级经理在最高层

我希望超级经理能给总经理一些钱,总经理能给普通经理一些钱。我的问题是我不希望主管理器能够给超级管理器一些钱,我也不想使用
instanceof
来确保这一点,因为它违背了复合模式的目的


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

听起来您的层次结构并不适合复合模式。复合模式旨在允许以与单个对象相同的方式处理对象集合。(考虑将零件栓接在一起。有时,您希望将子部件视为可以与其他零件/子部件栓接在一起的单个零件。子部件是复合件。)如果我了解您试图执行的操作,则您没有希望将其视为另一个管理器的管理器对象集合


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

听起来您的层次结构并不适合复合模式。复合模式旨在允许以与单个对象相同的方式处理对象集合。(考虑将零件栓接在一起。有时,您希望将子部件视为可以与其他零件/子部件栓接在一起的单个零件。子部件是复合件。)如果我了解您试图执行的操作,则您没有希望将其视为另一个管理器的管理器对象集合


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

正如Ted Hopp已经提到的,这听起来不像是使用复合模式的方式。这听起来像是一个案例

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

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

正如Ted Hopp已经提到的,这听起来不像是使用复合模式的情况。这听起来像是一个案例

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

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

我将扩展@Ted Hopp的答案,并建议您可以使用grade代替深度。这可能更接近您正在使用的域。既然你已经指出你有分级经理,这可能是一个优雅的解决方案


希望这能有所帮助。

我将扩展@Ted Hopp的答案,并建议您使用grade代替深度。这可能更接近您正在使用的域。既然你已经指出你有分级经理,这可能是一个优雅的解决方案


希望能有所帮助。

谢谢,因为我不想在我的code@Jackwelch
的instanceof
可能表明编码风格不好,但跳出圈套来避免它并不是更好的选择。如果您必须这样做,那么可能需要在其他地方进行一些重构。谢谢您,因为我不想在我的code@Jackwelch
的instanceof
可能表明编码风格不好,但跳出圈套来避免它并不是更好的选择。如果必须这样做,可能需要在其他地方进行一些重构。