接口作为方法参数

在java8中,我们可以使用接口作为方法参数。

例如:

chargeCard可以有两种类型的card(1- cardDetailDto 2-cardReferenceDto), 因此在这里,可以用接口作为参数。

public interface PaymentProvider { 

  PaymentsResponse chargeCard(Charge charge);
}

 

在Charge接口中,定义了一个返回PaymentsRequest的一个方法。

public interface Charge { 

  PaymentsRequest generatePaymentsRequest();
}

 

封装两个Dto ChargeCardReferenceDto和ChargeCardDetailDto,继承BaseChargeDto

@MappedSuperclass
@Data
public class BaseChargeDto {

  private String employerReference;

  private BigDecimal cost;

}
@EqualsAndHashCode(callSuper = true)
@Builder
@Value
public class ChargeCardReferenceDto extends BaseChargeDto {

  String cardReference;
}
@Builder
@Value
@EqualsAndHashCode(callSuper = true)
public class ChargeCardDetailDto extends BaseChargeDto {

  String encryptedCardNumber;

  String encryptedExpiryMonth;

  String encryptedExpiryYear;

  String encryptedSecurityCode;

  String holderName;
}

PaymentsRequestFactory是一个工具类,生成不同的PaymentsRequest。

@Component
public class PaymentsRequestFactory {

  public PaymentsRequest buildPaymentsRequestWithCardDetail(
      final ChargeCardDetailDto chargeCardDetailDto,
      final CobraUser user) {
    final PaymentsRequest paymentsRequest =
        buildBasicPaymentsRequest(
            user,
            chargeCardDetailDto.getEmployerReference(),
            chargeCardDetailDto.getCost()
        );
    final DefaultPaymentMethodDetails paymentMethodDetails =
        new DefaultPaymentMethodDetails()
            .encryptedCardNumber(chargeCardDetailDto.getEncryptedCardNumber())
            .encryptedExpiryMonth(chargeCardDetailDto.getEncryptedExpiryMonth())
            .encryptedExpiryYear(chargeCardDetailDto.getEncryptedExpiryYear())
            .encryptedSecurityCode(chargeCardDetailDto.getEncryptedSecurityCode())
            .holderName(chargeCardDetailDto.getHolderName())
            .type(PaymentMethodType.TYPE_SCHEME)
            .storeDetails(true);
    paymentsRequest.paymentMethod(paymentMethodDetails);
    return paymentsRequest;
  }

  public PaymentsRequest buildPaymentsRequestWithCardReference(
      final ChargeCardReferenceDto chargeCardReferenceDto,
      final CobraUser user) {
    final PaymentsRequest paymentsRequest =
        buildBasicPaymentsRequest(
            user,
            chargeCardReferenceDto.getEmployerReference(),
            chargeCardReferenceDto.getCost()
        );
    final DefaultPaymentMethodDetails paymentMethodDetails =
        new DefaultPaymentMethodDetails()
            .storedPaymentMethodId(chargeCardReferenceDto.getCardReference())
            .type(PaymentMethodType.TYPE_SCHEME);
    paymentsRequest.paymentMethod(paymentMethodDetails);
    paymentsRequest.shopperInteraction(ShopperInteractionEnum.CONTAUTH);
    return paymentsRequest;
  }

  PaymentsRequest buildBasicPaymentsRequest(
      final CobraUser user,
      final String employerReference,
      final BigDecimal cost) {
    final Amount amount = PaymentAmount.from(cost);
    return
        new PaymentsRequest()
            .amount(amount)
            .shopperReference(employerReference)
            .merchantAccount(merchantAccount);
  }
}

 

 在service层,在调用paymentProvider.chargeCard(...)时,用lambda表达式作为方法参数。

public PaymentsResponse chargeCardByCardDetail(
      final ChargeCardDetailDto chargeCardDetailDto,
      final CobraUser currentUser) {
    return paymentProvider
        .chargeCard(() -> paymentsRequestFactory
            .buildPaymentsRequestWithCardDetail(chargeCardDetailDto, currentUser));
  }

  public PaymentsResponse chargeCardByCardReference(
      final ChargeCardReferenceDto chargeCardReferenceDto,
      final CobraUser currentUser) {
    return paymentProvider
        .chargeCard(() -> paymentsRequestFactory
            .buildPaymentsRequestWithCardReference(chargeCardReferenceDto, currentUser));
  }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当一个方法参数是一个接口类型,并且该接口类型被匿名内部类实现时,我们可以使用匿名内部类实现接口回调。具体来说,我们可以在匿名内部类中重写接口中的方法,并在方法中实现我们需要的逻辑。然后将匿名内部类的实例作为接口类型参数传递给方法。当方法执行时,它会调用该接口方法,而该方法实际上是匿名内部类中的重写方法,从而实现了接口回调。 例如,我们可以定义一个接口`OnClickListener`,它包含一个`onClick()`方法,然后使用一个匿名内部类实现它,如下所示: ``` public interface OnClickListener { void onClick(); } public class Button { public void setOnClickListener(OnClickListener listener) { // ... } } public class MyApp { public static void main(String[] args) { Button button = new Button(); button.setOnClickListener(new OnClickListener() { @Override public void onClick() { System.out.println("Button Clicked!"); } }); } } ``` 在这个例子中,我们在`MyApp`类中创建了一个`Button`对象,并使用一个匿名内部类实现了`OnClickListener`接口。在匿名内部类中,我们重写了`onClick()`方法,并在方法中输出了一条消息。然后,我们将该匿名内部类的实例作为参数传递给`Button`类的`setOnClickListener()`方法。当用户点击按钮时,`Button`类会调用`OnClickListener`接口的`onClick()`方法,而实际上它会调用匿名内部类中的重写方法,从而实现了接口回调。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值