我有一个员工分为两个(国内和国际(。我还有另一类退款,用于向员工退款。我有一个名为"银行帐户"的类,该类由退款类用于退款。
现在我的直接设计如下所示:
员工界面,有国内和国际2个子类型。
退款类在构造函数中采用银行。
退款类的粗略伪代码
Class Refund
Refund( bank account )
Public class Refund( employee ) {
If (employee is domestic) {
Pay to bank
Account for taxes
} else {
do currency conversion
Pay to bank
Call some 3rd party to do taxation
}
}
}
现在这是我的问题:
如何将退款类替换为面向对象的设计,这是可扩展的,我不需要使用if-else?
直接选项是将退款功能转移到员工类中,然后各个子类型可以执行自己的退款逻辑。但是 - 用退款逻辑使员工类复杂化是否有意义(鉴于其复杂的功能,它应该有自己的模块化类(?
在我简要阅读了您的问题之后,我认为双重调度是您所寻求的。例如,参见 https://sourcemaking.com/design_patterns/visitor/java/2<</p>
为了保持 OO 设计并使其可扩展,而不将功能转移到 Employee 类,也许您只需向员工类添加属性,例如员工类型(国内/国际(以及退款类型,然后您可以使用现在可扩展的退款类进行特定类型的退款?
员工 -> 帐户[] 与类型、货币 -> 条目[]
员工 -> 具有货币的帐户[] -> 条目 [] 与类型
您可以将每个帐户用于类型(退款(和货币,或者最好是仅将帐户用于每种货币和类型为(退款(的条目
其余的应该由服务完成!