我参与了一个Java项目,该项目从不同的支付代理获取支付信息,处理它并存储到我们的计费系统(数据库)。
由于我们有不同的代理商,因此我们有不同的付款协议,我们有时会采用类似的,有时候不同的方式来处理付款某些协议需要添加,检查和删除付款,某些协议需要检查支付状态并添加付款,而其他协议则需要实施非常具体的协议方法。因此很难设计DAO接口的层次结构。
最终,我们创建了一个通用DAO接口,支持所有可能的付款方法,以及每个支付代理的DAO接口的一个实现。如果支付代理不支持特定方法实现,则抛出UnsupportedOperationException()。 E.g:
piblic interface Dao {
void addPayment(Payment p);
void removePayment(Payment p);
...
String getVersion();
}
public PaymentAgentDao implements Dao {
public void addPayment(Payment p) {...}
public void removePayment(Payment p) {...}
public String getVersion() {
throw new UnsupportedOperationException();
}
}
public AnotherAgentDao implements Dao {
public void addPayment(Payment p) {...}
public void removePayment(Payment p) {
throw new UnsupportedOperationException();
}
public String getVersion() {...}
}
我想知道处理这种情况的最佳方法是什么?另一种方法是创建特定的接口(我在SOLID中的原则),但由于不可能创建接口层次结构,因此会有代码重复。没有支持所有支付代理的基本方法。处理这种情况的最佳做法是什么?
答案 0 :(得分:1)
我认为这是正确的,但它可以略有改进。
我认为接口的更好名称是Agent甚至PaymentAgent,因为这是系统中对象的类型。我坚持认为你有所有这些类型的单一类型,但是对象会像人一样不同 - 所有类似,但做同样的事情有点不同。因此,一个代理只是付款,另一个代理检查,第三个可以做黑魔法......
除了界面之外,我还要创建一个抽象类PaymentAgentAdapter,所有方法都具体,但什么都不做。这样,这些代理的所有具体对象都只需要实现它们实际需要的方法。这有助于缩短代码。
我会考虑抛弃UnsupportedOperationException带来的不便甚至不正确,因为它需要在客户端尝试捕获代理的所有方法。