当前位置: 首页 > news >正文

旅行社网站怎么做平凉建设局网站

旅行社网站怎么做,平凉建设局网站,做品牌特价的网站,建设部招标网 官方网站SOLID - 依赖倒置原则(Dependency Inversion Principle) 定义 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的五大基本原则之一,通常缩写为SOLID中的D。DIP由Robert C. Martin提出&…

SOLID - 依赖倒置原则(Dependency Inversion Principle)

Dependency Inversion Principle

定义

依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的五大基本原则之一,通常缩写为SOLID中的D。DIP由Robert C. Martin提出,其核心思想是:

Depend upon abstractions, not concretions.

依赖倒置原则主要体现在以下两个方面:

  1. 高层模块不应依赖于低层模块,两者都应该依赖于抽象。
  2. 抽象不应该依赖于细节,细节应该依赖于抽象。

通过遵循依赖倒置原则,可以使得系统架构更加稳定、灵活和易于维护。

使用情境

依赖倒置原则主要应用在以下情境中:

  1. 模块化设计:在模块化设计中,通过依赖抽象,提升模块的重用性和灵活性。
  2. 插件架构:在插件架构中,不同插件通过抽象接口进行通信,实现松耦合。
  3. 依赖注入:通过依赖注入(Dependency Injection,DI)实现依赖倒置,有助于提高代码的可测试性和可维护性。

示例

以下是一个不遵循依赖倒置原则的示例:

不遵循依赖倒置原则的设计

class MySqlDatabase {public void connect() {// MySQL数据库连接逻辑}
}class DataService {private MySqlDatabase mySqlDatabase;public DataService() {this.mySqlDatabase = new MySqlDatabase();}public void getData() {mySqlDatabase.connect();// 获取数据逻辑}
}

在这个设计中,DataService类直接依赖于具体的MySqlDatabase类。当需要更换数据库实现时,必须修改DataService类的代码。

遵循依赖倒置原则的设计

为了消除这种依赖,可以引入一个抽象接口:

interface Database {void connect();
}class MySqlDatabase implements Database {public void connect() {// MySQL数据库连接逻辑}
}class OracleDatabase implements Database {public void connect() {// Oracle数据库连接逻辑}
}class DataService {private Database database;public DataService(Database database) {this.database = database;}public void getData() {database.connect();// 获取数据逻辑}
}

在这个设计中,DataService类通过依赖注入获得一个Database接口的实现,这样就实现了对抽象的依赖,而不是具体实现。这个设计使得DataService类不再依赖于特定的数据库实现,从而提升了系统的灵活性。

在Spring Boot中的应用

goal-of-software-arch

在Spring Boot中,DIP作为Spring Framework核心理念的一个重要组成部分,得到了广泛应用。DIP主要通过依赖注入(Dependency Injection, DI)实现,使得高层模块不会直接依赖于低层模块,而是依赖于抽象接口,而低层模块也实现这些抽象接口,从而实现系统的松耦合和高扩展性。

以下通过一个具体示例展示如何在Spring Boot中使用依赖倒置原则。

示例:订单服务与支付服务

假设我们需要实现一个订单服务(OrderService),其中包含一个支付服务(PaymentService)。为了使系统更具灵活性和可扩展性,我们将使用依赖倒置原则设计这些服务。

1. 定义抽象接口

首先,我们定义一个支付服务接口PaymentService,并定义一个实现类PayPalServiceStripeService

// src/main/java/com/example/demo/service/PaymentService.java
package com.example.demo.service;public interface PaymentService {void processPayment(double amount);
}// src/main/java/com/example/demo/service/impl/PayPalService.java
package com.example.demo.service.impl;
import com.example.demo.service.PaymentService;
import org.springframework.stereotype.Service;@Service
public class PayPalService implements PaymentService {@Overridepublic void processPayment(double amount) {System.out.println("Processing payment of $" + amount + " through PayPal");}
}// src/main/java/com/example/demo/service/impl/StripeService.java
package com.example.demo.service.impl;
import com.example.demo.service.PaymentService;
import org.springframework.stereotype.Service;@Service
public class StripeService implements PaymentService {@Overridepublic void processPayment(double amount) {System.out.println("Processing payment of $" + amount + " through Stripe");}
}
2. 注入依赖

然后,我们定义订单服务OrderService,并通过构造器注入依赖的支付服务PaymentService

// src/main/java/com/example/demo/service/OrderService.java
package com.example.demo.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {private final PaymentService paymentService;@Autowiredpublic OrderService(PaymentService paymentService) {this.paymentService = paymentService;}public void createOrder(double amount) {// 订单创建逻辑System.out.println("Creating order for amount: $" + amount);paymentService.processPayment(amount);}
}
3. 配置类

为了更好地控制依赖,可以通过配置类来指定使用的具体实现。在此示例中,我们可以使用Spring的配置类来让Spring容器管理我们选择的支付服务。

// src/main/java/com/example/demo/config/AppConfig.java
package com.example.demo.config;import com.example.demo.service.PaymentService;
import com.example.demo.service.impl.PayPalService;
import com.example.demo.service.impl.StripeService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic PaymentService paymentService() {// 在这里选择具体实现类,可以通过条件选择不同实现return new PayPalService();// 或者// return new StripeService();}
}
4. 启动类

接下来,我们编写Spring Boot启动类并运行应用。

// src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;import com.example.demo.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication implements CommandLineRunner {@Autowiredprivate OrderService orderService;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Overridepublic void run(String... args) throws Exception {orderService.createOrder(100.0);}
}
5. 运行结果

运行应用后,可以看到如下输出(如果配置为使用PayPalService):

Creating order for amount: $100.0
Processing payment of $100.0 through PayPal

结论

依赖倒置原则(DIP)是创建高效、灵活、可维护系统的重要原则之一。依赖倒置原则通过让高层模块依赖抽象接口,而不是具体实现,使得系统更具灵活性和可扩展性。Spring Boot通过依赖注入(Dependency Injection)和配置类(Configuration)提供了优雅的方式来实现这一原则,使得开发更加简便和高效。

关于SOLID设计原则的总体描述,请参考:软件设计还是要SOLID!

http://www.yayakq.cn/news/638614/

相关文章:

  • 成都网站建设销售50人办公室网络搭建
  • 建个淘宝那样的网站需要多少钱租用网站服务器
  • 先进网站建设有哪些建设网站证书
  • 图片在线设计网站如何创建网站内容
  • html5创意网站移动网站适配
  • 网站开发需要什么资料电子商务营销网站建设
  • 天河电子商务网站建设网站不更新
  • 简述网站开发设计流程图阿里云购买域名后怎么建网站
  • 苏州企业网站建站小程序开发的价格
  • 爱站网站长百度查询权重网站优化站外链接怎么做
  • 网站开发制作asp网站后台密码文件
  • 死链接对网站的影响wordpress应用主题出错
  • 网络推广营销策划方案黄冈网站seo
  • 学校加强网站建设石家庄建设网
  • 怎么建论坛网站solaris.wordpress
  • 网站这么做优化网站开发需要准备什么软件
  • 东莞网络推广网站一个人开公司做网站
  • 个人站长适合做什么网站农家乐网站源码
  • 做网站需要多久wordpress.org教程
  • 关于做美食的小视频网站做网站怎么开发程序
  • 国外网站备案吗长沙网站托管
  • 高校网站建设制度做网络传销网站犯法吗
  • 有域名 空间如何建网站注册小公司
  • 单页网站建设平台哪个好山东网站备案注销申请表
  • 机关门户网站app建设思考wordpress付费查看下载主题
  • 啥网站都能看的浏览器下载中国十大传媒公司排名
  • 办网站除了域名备案 还需要什么苏州做淘宝网站
  • 2017做哪些网站致富企业网站托管的方案
  • 跨境电商erp选哪个好南阳seo招聘
  • 免费建网站程序能打开的网站