想象一下以下情况:
example http://img4.imageshack.us/img4/9849/oop2.png
可能会注意到Handler
- 孩子和Costumer
- 孩子相互匹配。每个Handler
都有一个需要客户的方法。
有没有什么好方法可以确保Handler
- 实现只需要相应的Costumer
- 实现或其中的任何子项?
一些例子:
Handler
将占用所有Costumers
HandlerA
将CostumerA
和CustomerAA
但不会CostumerB
或Costumer
HandlerAA
只会CostumerAA
我提出了一些想法:
Handler
实施检查,看它是否知道<{1}} 这些都不好看,因为总是需要对结构进行硬编码。如果添加另一个子类,则需要更改检查哪个非常糟糕的逻辑。
答案 0 :(得分:2)
我并不为这个设计而疯狂,但我可以想到它可能适合的情况。
Spring Validator接口采用了类似的方法。类似于他们的解决方案是使Handler接口包含方法boolean handles(Class c)
。然后,每个Handler实现都有一个简单的方法,如
public class HandlerA extends Handler {
boolean handles(Class c) {
return (CustomerA.class.isAssignableFrom(c));
}
//etc.
}
当然,实施会因您的语言/平台而异。
这样,调用Handler的调用者负责通过调用此方法首先检查它是否是正确的处理程序。
答案 1 :(得分:1)
根据您的确切要求,似乎每个类或子类必须知道的唯一事物是另一个层次结构中的相应类或子类。我认为没有要求知道它的子类。
几个简单的实现可能符合您的需求:
请告诉我是否/我错了: - )
正如马克所说,也许你有一种设计气味...... :-) 拥有两个相互映射的层次结构可能不是最好的事情...... 如果你想......我们可以帮你解决这个问题: - )