如何在对象中建模不同的信息?

时间:2014-12-04 10:12:51

标签: oop

我想让用户选择不同的付款方式。所以我有一个描述付款方式的课程。

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本身检查其成员。

我确信也可能有其他方法。

那么实现这个的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我不会创建类PaymentMethod,您可以使用方法PaymentInformation创建一个接口getPaymentMethod,每个实现此接口的类都需要覆盖。 你的PaymentMethod将是一个枚举(CREDIT_CARD,PAYPALL,......)。

现在每个实现都有您想要的信息。

在您的OrderBean中,您可以在需要时致电PaymentMethod来获取paymnetInformation.getPaymentMethod()

答案 1 :(得分:0)

PaymentInformationPaymentMethod密切相关。 在我看来,paymentInformation应该是PaymentMethod的字段。 PaymentMethod类应提供填充其内部paymentInformation的方法。 PaymentInformation类可以是PaymentMethod的内部类来表示相关性。

你能想到独立使用PaymentInformation的用例,例如,在没有相应付款方式的情况下存储它吗?如果是,您可以为interface创建共享PaymentInformation,否则您无需这样做。

- 编辑 -

关于您在何处检查实际付款类型以便提供特定付款行为的重复问题:

尝试将代码从外部代码转移到对象,从而使代码的其余部分与支持类型无关。您应该调用paymentInformation的方法(例如paymentInformation.createReport(),paymentInformation.issueBill())等,而不是检查instanceOf然后做某事,并让实际的付款方式+信息决定他们的拥有如何表现。因为谁还应该比实际对象更清楚?