2014-12-04 6 views
1

사용자가 다른 결제 수단을 선택하게하고 싶습니다. 따라서 지불 방법을 설명하는 클래스가 있습니다. 오브젝트에 다른 정보를 어떻게 모델링합니까?

public class PaymentMethod { 
    private int id; 
    private String name; 
    private String description; 

    //Constructors, Accessors... 
} 

는 지금은 사용자의 검색을 잡고 빈을

public class OrderBean { 
    private List<PaymentMethod> availablePayments; 
    private PaymentMethod selectedPayment; 
    private PaymentInformation paymentInfo; 
} 

내 질문은 얼마나 최고의 모델 PaymentInformation 클래스에. 내가 직면하고있는 문제는 선택한 PaymentMethod에 따라 해당 객체에 보관할 정보가 매우 다를 수 있다는 것입니다. 우리가에 의해 지불

  • 신용 카드 번호
  • 카드 보안 코드
  • 소유자
  • 유효 기간

필요

지불 방법 "신용 카드"에 대한 예를 들어

우리가 필요로하는 PayPal (나는 정말로 모른다. 단지 나의 요점을 만들기 위해.)

  • 이메일 주소 우리는 필요
  • 자동 이체로 지불을 위해

  • 소유자
  • 계좌 번호
  • 여기

내가 와서 몇 솔루션입니다 신용 기관 지금까지 :

3 가지 다른 클래스를 디자인하십시오. OrderBean에 세 가지 다른 참조가 있고 selectedPayment에 따라 올바른 참조가 채워 졌는지 확인하십시오.

이러한 세 클래스가 공통 기본 클래스 또는 인터페이스에서 상속하고 OrderBean에있는 하나의 참조의 실제 유형을 확인하게하십시오.

PaymentMethod 필드와 함께 모든 지불 정보에 대해 하나의 클래스를 만들고 클래스 자체가 PaymentMethod에 따라 해당 멤버를 검사하게하십시오.

다른 방법이있을 수도 있습니다.

그래서 이것을 구현하는 가장 좋은 방법은 무엇입니까?

+0

몸에 더 좋은 제목이나 더 적절한 태그가 나오면 감사하겠습니다. –

+0

지불 방법 : 신용 카드, 페이팔, ...? –

+0

@TomJonckheere 예 –

답변

0

PaymentInformationPaymentMethod과 관련된 것들입니다. 내 생각에 paymentInformationPaymentMethod 필드 여야합니다. PaymentMethod 클래스는 내부에 paymentInformation을 채우는 메소드를 제공해야합니다. PaymentInformation 클래스는 상관 관계를 표현하기 위해 PaymentMethod의 내부 클래스가 될 수 있습니다.

PaymentInformation을 개별적으로 사용하는 경우를 생각해 볼 수 있습니까? 예 : 각 결제 수단없이 저장 하시겠습니까?예인 경우 PaymentInformation에 대해 interface 공유를 만들 수 있습니다. 그렇지 않으면 그렇게 할 필요가 없습니다. 에 외부 코드에서 책임 지표를 이동하는

시도를 : 지불 특정 행동을 제공하기 위해 실제 지불 유형을 확인하는 위치에 대해 반복되는 질문에 대해서는

--EDIT--

개체, 따라서 귀하의 코드 지불 - 유형 불가 지론의 나머지 부분을 만들고있어. instanceOf을 확인한 다음 무언가를하는 대신 paymentInformation (예 : paymentInformation.createReport(), paymentInformation.issueBill()) 등의 메소드를 호출하고 실제 지불 방법 + 정보가 자신의 행동 방식을 결정하도록해야합니다 . 실제 객체보다 누가 더 잘 알아야할까요?

+0

이 답변에 대한 다른 답변에 귀하의 의견을 포함시켜야합니다! –

+0

완료, 그것을 지적 해 주셔서 감사합니다. – Dennis

1

PaymentMethod 클래스를 만들지 않으므로이 인터페이스를 구현하는 각 클래스가 재정의해야하는 getPaymentMethod 메서드로 인터페이스 PaymentInformation을 만들 수 있습니다. PaymentMethod은 열거 형입니다 (CREDIT_CARD, PAYPALL, ...).

이제 각 구현에 원하는 정보가 있습니다.

OrderBean에서 paymnetInformation.getPaymentMethod()을 호출하여 PaymentMethod을 얻을 수 있습니다.

+0

'OrderBean'은 어떻습니까? 'PaymentInformation'의 레퍼런스를 타이핑 할 필요가 있습니까? –

+0

내 대답이 업데이트 되었습니까? –

+0

'PaymentInformation instanceOf CreditCardInfo'와'paymentInformation.getPaymentMethod(). equals (CREDIT_CARD)'의 장점은 무엇입니까? –

관련 문제