我想让用户选择不同的付款方式。所以我有一个描述付款方式的课程。
public class PaymentMethod {
private int id;
private String name;
private String description;
//Constructors, Accessors...
}
现在我有一个bean,可以选择用户
public class OrderBean {
private List<PaymentMethod> availablePayments;
private PaymentMethod selectedPayment;
private PaymentInformation paymentInfo;
}
我的问题是如何最好地模拟PaymentInformation
课程。我面临的问题是,根据所选择的PaymentMethod,在该对象中保存的信息可能非常不同。
例如,对于付款方式“信用卡”,我们需要
对于通过PayPal付款,我们需要(我真的不知道。只是为了表明我的观点。)
对于使用直接付款方式付款,我们需要
到目前为止,我提出了几个解决方案:
设计三个不同的类。让OrderBean
有三个不同的引用,并根据selectedPayment
检查是否填充了正确的引用。
让这三个类继承自公共基类或接口,并检查OrderBean
中的一个引用的实际类型。
为所有付款信息创建一个课程,并添加PaymentMethod
字段,让课程根据PaymentMethod
本身检查其成员。
我确信也可能有其他方法。
那么实现这个的最佳方法是什么?
答案 0 :(得分:1)
我不会创建类PaymentMethod
,您可以使用方法PaymentInformation
创建一个接口getPaymentMethod
,每个实现此接口的类都需要覆盖。
你的PaymentMethod
将是一个枚举(CREDIT_CARD,PAYPALL,......)。
现在每个实现都有您想要的信息。
在您的OrderBean
中,您可以在需要时致电PaymentMethod
来获取paymnetInformation.getPaymentMethod()
。
答案 1 :(得分:0)
PaymentInformation
和PaymentMethod
密切相关。
在我看来,paymentInformation
应该是PaymentMethod
的字段。 PaymentMethod
类应提供填充其内部paymentInformation
的方法。 PaymentInformation
类可以是PaymentMethod的内部类来表示相关性。
你能想到独立使用PaymentInformation
的用例,例如,在没有相应付款方式的情况下存储它吗?如果是,您可以为interface
创建共享PaymentInformation
,否则您无需这样做。
- 编辑 -
关于您在何处检查实际付款类型以便提供特定付款行为的重复问题:
尝试将代码从外部代码转移到对象,从而使代码的其余部分与支持类型无关。您应该调用paymentInformation的方法(例如paymentInformation.createReport(),paymentInformation.issueBill())等,而不是检查instanceOf
然后做某事,并让实际的付款方式+信息决定他们的拥有如何表现。因为谁还应该比实际对象更清楚?