我正在编写一个涉及复合模式的代码,并希望得到一些澄清。我有超级经理,主要经理和普通经理,他们处于下降层次,超级经理位于顶层。
我希望超级经理能够给总经理一些钱,主经理能够给普通经理一些钱。我遇到的问题是我不希望Main Manager能够给Super Manager一些钱,而且我不想使用instanceof
来确保它,因为它违背了Composite模式的目的。
我的主经理和普通经理扩展了一个名为gradeManagers的抽象类,而我的超级管理器有一个数组列表,可以添加类型为gradeManagers的组件。
答案 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的答案,并建议不要使用年级而不是深度。这可能更接近您正在使用的域。既然你已经指出你有分级经理,这可能是一个优雅的解决方案。
希望有所帮助。