Java 转发到某个接口
在 Java 编程中,我们经常遇到需要将一个对象的方法调用转发给另一个对象处理的情况。这种转发的技术在面向对象编程中被称为委托模式。委托模式通过将任务分配给其他对象来实现代码的重用和解耦。
委托模式简介
委托模式是一种结构型设计模式,它允许一个对象将一些任务委托给其他对象来完成。在委托模式中,有两个关键角色:委托者和代理者。委托者是调用方,它将任务委托给代理者来完成。代理者是实际执行任务的对象,它实现了接口或继承了父类,并在其中实现了具体的任务逻辑。
委托模式的核心思想是通过接口或抽象类来定义任务,并将任务的具体实现交给不同的对象。这样,可以根据需要灵活地切换任务的实现,而不影响委托者的代码。
示例场景
假设我们有一个在线商店系统,其中有一个 PaymentService
接口定义了支付的方法:
public interface PaymentService {
void pay(double amount);
}
我们有两种支付方式:Alipay
和 WechatPay
。它们分别实现了 PaymentService
接口:
public class Alipay implements PaymentService {
@Override
public void pay(double amount) {
// Alipay pay implementation
}
}
public class WechatPay implements PaymentService {
@Override
public void pay(double amount) {
// WechatPay pay implementation
}
}
现在,我们有一个 Order
类表示一个订单,它需要使用 PaymentService
来进行支付。我们可以通过将 PaymentService
作为 Order
类的成员变量,并在其中调用支付方法来实现支付:
public class Order {
private PaymentService paymentService;
public Order(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void makePayment(double amount) {
paymentService.pay(amount);
}
}
这样,在订单类中,我们可以根据不同的支付方式来进行支付,而无需修改 Order
类的代码。
委托模式的实现
在上述示例中,我们使用了构造函数来传递 PaymentService
对象,并在 makePayment
方法中调用了 pay
方法。但是,这种实现方式要求在每次创建订单对象时都要手动传递正确的支付方式对象。
为了更加灵活地切换支付方式,我们可以使用委托模式来实现。具体实现如下:
public class Order {
private PaymentService paymentService;
public Order() {
this.paymentService = new Alipay(); // 默认使用 Alipay 支付方式
}
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void makePayment(double amount) {
paymentService.pay(amount);
}
}
在上述代码中,我们添加了一个 setPaymentService
方法,用于动态地切换支付方式。默认情况下,Order
类将使用 Alipay
作为支付方式。但是,我们可以通过调用 setPaymentService
方法来将支付方式切换为其他实现了 PaymentService
接口的对象,例如 WechatPay
:
Order order = new Order();
order.makePayment(100.0); // 使用默认的 Alipay 支付方式
order.setPaymentService(new WechatPay());
order.makePayment(200.0); // 使用切换后的 WechatPay 支付方式
通过这种方式,我们可以在运行时动态地切换支付方式,而不需修改 Order
类的代码。
使用代理对象实现委托模式
上述实现方式中,我们需要手动地在 Order
类中切换支付方式。但是,如果系统中有多处地方需要切换支付方式,那么每次都手动调用 setPaymentService
方法就显得非常繁琐。
为了解决这个问题,我们可以引入一个代理对象来实现委