gpt4 book ai didi

oop - 关于开放/封闭主体的困惑

转载 作者:行者123 更新时间:2023-12-02 19:10:14 24 4
gpt4 key购买 nike

开放/封闭原则规定类对修改关闭但对扩展开放。假设我们要设计一个支付系统,支付可以由多个处理器处理,如下所示:

    class Payment {
void pay(paymentMethod) {
switch (paymentMethod) {
case 'PayPal':
break;
case 'Swift':
break;
default:
break;
}
}
}

class PayPal {
void pay() {
//implement payment1
}
}

class Swift {
void pay() {
//implement payment2
}
}

假设我们是第一次实现这两种支付系统。现在,如果由于某种原因改变了任何支付系统的实现过程,我们是否应该修改相关的类?比如我们实现了PayPal,2-3年后PayPal的工作流程发生了变化,修改PayPal类不就破坏了open/closed原则吗?如果可以,解决方案是什么?

最佳答案

在您的 Payment 类中使用 switch 语句打破了开闭原则,因为它使 Payment 的抽象概念与具体实现 PayPalSwift。为了添加或删除受支持的支付类型,您必须编辑 Payment.pay() 方法。

更好的设计使用 interface 来描述支付提供商的外观。在这种情况下,它必须有一个 void pay() 方法。

不是将 paymentMethod 参数作为 stringPayment.pay() 应该接受一个实现支付的类的实例供应商接口(interface)。它可以调用 paymentMethod.pay() 来执行正确的功能。 (根据您的实际设置,将此参数传递给构造函数可能比传递给方法更好)。

通过这种方式,添加或删除支付提供商变得非常容易,因为 Payment 类不需要任何有关存在哪些提供商类的信息。

interface PaymentProvider {
void pay();
}

class Payment {
void pay(paymentMethod: PaymentProvider) {
paymentMethod.pay();
}

class PayPal implements PaymentProvider {
void pay() {
//implement payment1
}
}

class Swift implements PaymentProvider {
void pay() {
//implement payment2
}
}

关于oop - 关于开放/封闭主体的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64413706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com