Java 中的多态是面向对象编程的核心概念之一,它允许对象以其所属类或接口的任何形式被引用。多态性提供了一种方式,使得一个类可以有多种形式。在重构代码时,使用多态可以使得代码更加灵活、可维护,并减少重复代码。

1、原始代码

如我们有一个应用程序,它可以处理不同类型的支付方式,比如信用卡支付和借记卡支付。最初的实现可能没有使用多态,代码如下,

public class Main {
  public static void main(String[] args) {
    PaymentProcessor processor = new PaymentProcessor();
    processor.processCreditCardPayment(new CreditCardPayment());
    processor.processDebitCardPayment(new DebitCardPayment());
    System.exit(0); //success
  }
}
class CreditCardPayment {
    void Pay()
    {
        // 信用卡支付逻辑
        System.out.println("信用卡支付逻辑");
    }
}

class DebitCardPayment {
    void Pay()
    {
        // 借记卡支付逻辑
        System.out.println("借记卡支付逻辑");
    }
}
class PaymentProcessor {
    void processCreditCardPayment(CreditCardPayment payment) {
        // 处理信用卡支付
        System.out.println("处理信用卡支付");
        payment.Pay();
    }

    void processDebitCardPayment(DebitCardPayment payment) {
        // 处理借记卡支付
       System.out.println("处理借记卡支付");
       payment.Pay();
    }
}

2、使用多态重构

多态是一种将行为与实现分离的编程技巧,使得可以使用一个共同的接口来引用不同的实现。通过多态,可以编写更灵活和可维护的代码,也是重构的一个重要手段。使用多态重构这段代码,则可以创建一个共同的接口(比如 Payment),然后让不同的支付方式实现这个接口。如此PaymentProcessor 类就可以针对该接口编程,而不是针对具体的支付方式。代码如下,

public class Main {
  public static void main(String[] args) {
    PaymentProcessor processor = new PaymentProcessor();
    processor.processPayment(new CreditCardPayment());
    processor.processPayment(new DebitCardPayment());
    System.exit(0); //success
  }
}

interface Payment {
    void processPayment();
}

class CreditCardPayment implements Payment {
    @Override
    public void processPayment() {
        // 信用卡支付逻辑
        System.out.println("借记卡支付逻辑");
    }
}

class DebitCardPayment implements Payment {
    @Override
    public void processPayment() {
        // 借记卡支付逻辑
        System.out.println("借记卡支付逻辑");
    }
}

class PaymentProcessor {
    void processPayment(Payment payment) {
        payment.processPayment();
    }
}

3、多态的使用总结

扩展性比较好,如果未来需要添加新的支付方式,只需要创建一个新的类实现 Payment 接口。PaymentProcessor 类现在不依赖于具体的支付实现,只依赖于 Payment 接口。实现了解耦。代码变得更加清晰,易于维护。可维护性和可读性提高。当使用多态时,重要的是要确保接口的设计能够满足所有实现类的需求。在一些场景中,可能需要使用抽象类而不是接口,尤其是当多个实现类之间有共享行为时。多态主要用于那些在概念上类似但在行为上有所不同的类。对于完全不相关的类,强行使用多态可能会导致代码结构混乱。通过应用多态性,可以将软件组件解耦,使得每个部分都更加独立,同时保持互操作性,从而使整个系统更加健壮和灵活。