依赖倒置

Posted 洗洗睡吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖倒置相关的知识,希望对你有一定的参考价值。

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

下面是一个简单的基于 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() 方法来执行订单结算,并使用不同的支付服务进行支付。

依赖倒置原则

一、依赖倒置原则定义

1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。

二、依赖倒置原则详解

在依赖倒置原则中的倒置指的是和一般OO设计的思考方式完全相反。

举个例子,现在你需要实现一个比萨店,你第一件想到的事情是什么?我想到的是一个比萨店,里面有很多具体的比萨,如:芝士比萨、素食比萨、海鲜比萨……
比萨店是上层模块,比萨是下层模块,如果把比萨店和它依赖的对象画成一张图,看起来是这样:

 
技术图片
                        正常依赖图

没错!先从顶端开始,然后往下到具体类,但是,正如你看到的你不想让比萨店理会这些具体类,要不然比萨店将全都依赖这些具体类。现在“倒置”你的想法……别从上层模块比萨店开始思考,而是从下层模块比萨开始,然后想想看能抽象化些什么。你可能会想到,芝士比萨、素食比萨、海鲜比萨都是比萨,所以它们应该共享一个Pizza接口。对了,你想要抽象化一个Pizza。好,现在回头重新思考如何设计比萨店。

 
技术图片
                  依赖倒置后的图

图一的依赖箭头都是从上往下的,图二的箭头出现了从下往上,依赖关系确实“倒置”了

总结:

依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。我们在项目中使用这个原则要遵循下面的规则:

  1、每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备

  2、变量的表面类型尽量是接口或者抽象类

  3、任何类都不应该从具体类派生

  4、尽量不要覆写基类的方法

  5、如果基类是一个抽象类,而这个方法已经实现了,子类尽量不要覆写。类间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会有一定的影响

  6、结合里氏替换原则使用

参考:https://www.jianshu.com/p/c3ce6762257c

https://www.cnblogs.com/az4215/p/11462878.html

https://baike.baidu.com/item/%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99/6189149?fr=aladdin

以上是关于依赖倒置的主要内容,如果未能解决你的问题,请参考以下文章

依赖倒置原则

依赖倒置原则

七大设计原则之依赖倒置原则应用

依赖倒置原则

依赖倒置

依赖倒置原则