首页 > 其他分享 >依赖倒置

依赖倒置

时间:2023-04-07 20:55:44浏览次数:32  
标签:依赖 service PaymentService self Order amount 倒置 payment

依赖倒置原则是面向对象编程的一个重要原则之一,它指出高层模块不应该依赖于底层模块,它们应该都依赖于抽象的接口。而抽象的接口不应该依赖于具体实现,具体实现应该依赖于抽象的接口。

下面是一个简单的基于 Python 的依赖倒置示例:

python
from abc import ABC, abstractmethod


class PaymentService(ABC):
    @abstractmethod
    def process_payment(self, amount: float) -> bool:
        pass


class PayPalPaymentService(PaymentService):
    def process_payment(self, amount: float) -> bool:
        print(f"Processing payment of {amount} via PayPal")
        # 实际的支付逻辑代码


class StripePaymentService(PaymentService):
    def process_payment(self, amount: float) -> bool:
        print(f"Processing payment of {amount} via Stripe")
        # 实际的支付逻辑代码


class Order:
    def __init__(self, payment_service: PaymentService):
        self.payment_service = payment_service

    def checkout(self, total_amount: float):
        if self.payment_service.process_payment(total_amount):
            print("Payment processed successfully!")
        else:
            print("Payment failed.")


if __name__ == '__main__':
    paypal_payment_service = PayPalPaymentService()
    stripe_payment_service = StripePaymentService()

    order1 = Order(paypal_payment_service)
    order1.checkout(100.0)

    order2 = Order(stripe_payment_service)
    order2.checkout(200.0)
在这个示例中,我们首先定义了一个名为 PaymentService 的抽象基类,其中定义了一个名为 process_payment() 的抽象方法。然后,我们定义了两个具体的支付服务类:PayPalPaymentService 和 StripePaymentService,它们都实现了 PaymentService 接口。

接下来,我们定义了一个名为 Order 的类,它依赖于 PaymentService 接口,并在其构造函数中注入了一个 PaymentService 实例。在 Order 类的 checkout() 方法中,我们调用 PaymentService.process_payment() 方法来进行支付操作。

在主程序中,我们创建了两个不同的 PaymentService 实例:一个是 PayPalPaymentService,另一个是 StripePaymentService。然后,我们分别创建了两个 Order 实例,并将它们的构造函数参数设置为不同的 PaymentService 实例。最后,我们调用了每个 Order 实例的 checkout() 方法来执行订单结算,并使用不同的支付服务进行支付。

标签:依赖,service,PaymentService,self,Order,amount,倒置,payment
From: https://www.cnblogs.com/weiweivip666/p/17297308.html

相关文章

  • 依赖注入
    当我们实现一个类时,有时候需要在类的构造函数中注入其它类的实例作为依赖。使用依赖注入可以使得代码更加灵活、可测试和可维护。下面是一个简单的基于Python的依赖注入示例:classEmailSender:defsend_email(self,to_addr:str,subject:str,body:str):p......
  • maven手动下载依赖
    有时候因为一些奇怪的原因,maven拉取不了依赖,此时需要手动下载maven依赖:进入中央仓库搜索需要的包https://mvnrepository.com/复制url根据模板拼接命令cmd命令模板:mvndependency:get-DremoteRepositories=url-DgroupId=groupId-DartifactId=artifactId-Dversion=ve......
  • pom中的maven依赖有一些拉取不了
    问题:项目里的pom文件中的maven依赖有一些拉取不了,在本地仓库也没有,但也有一些能正常拉取的。解决方法:方法1:点击maven的刷新按钮(reloadallproject)方法2:File->InvalidateCaches...,勾选所有4个选项,然后点击InvalidateandRestart。方法3:重启IDEA方法4:手动下载依赖,然后重......
  • flask请求上下文分析,源码request原理,wtforms,精确导出依赖,函数和方法,threading.locl对
    内容回顾蓝图第一步:导入第二步:实例化得到对象,可以指定static和templates第三步:app中注册蓝图,注册蓝图时,可以指定前缀第四步:使用蓝图,注册路由,注册请求扩展g对象当次请求的全局对象,在当次请求中可以放值和取值跟session的区别是session可以在多次请求中使用,g对象只在当次请......
  • flask之请求上下文分析之导出项目依赖-函数和方法的区别-threading.local对象-偏函数-
    目录flask之请求上下文分析之导出项目依赖-函数和方法的区别-threading.local对象-偏函数-flask整个生命执行流程--wtforms今日内容详细1请求上下文分析(源码:request原理)1.1导出项目的依赖1.2函数和方法1.3threading.local对象1.4偏函数1.5flask整个生命执行流程(1.1.4版本......
  • 忽略maven中冲突的依赖
    1:执行mvndependency:tree-Dverbose>tree.txt 2:打开tree.text文件例如这段[INFO]+-org.apache.mina:mina-core:jar:2.0.7:compile[INFO]|\-org.slf4j:slf4j-api:jar:1.6.6:compile//重复引入了slf4j那么需要在在pom依赖中添加忽略[INFO]\-......
  • 项目中没有依赖Kotlin,结果报错Kotlin版本问题
    ​ 背景:使用intellij-idea工具,springboot项目,使用的maven问题:项目中没有依赖Kotlin,结果报错Kotlin版本问题,如下Kotlin:ModulewascompiledwithanincompatibleversionofKotlin.Thebinaryversionofitsmetadatais1.7.1,expectedversionis1.1.15.解决方案:......
  • Go 语言进行依赖包的管理的几种方式
    Go语言具有丰富的开源包管理工具,可以方便地进行依赖包的管理。下面介绍如何在Go语言中安装依赖包。使用goget命令goget命令可以从远程代码仓库(比如GitHub)下载Go语言包,并安装到$GOPATH/src目录下。通常使用以下命令来安装一个依赖包:gogetgithub.com/依赖库路径......
  • 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controll
     参考链接:依赖注入(DI)or控制反转(IoC)laravel学习笔记——神奇的服务容器PHP依赖注入,从此不再考虑加载顺序名词解释IoC(Inversion of Controller) 控制反转(概念)DI(Dependency Inject) 依赖注入(IoC概念中的一种类型实现)通过依赖声明自动实例化依赖的类(通常通过反......
  • DI——依赖注入概念
       站在spring的角度看,是控制反转,由spring容器控制资源;站在程序的角度看,是依赖注入,程序依赖spring提供的资源; ......