为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

本文探讨了为何在编程中使用接口(Interface)而非直接使用实体类的原因,强调了接口作为规范,实现接口与实现类的分离,降低耦合性,提高系统的可扩展性和可维护性。接口的使用可以对应多个实现类,减少代码重复,降低耦合度。通过对比不使用接口和使用接口的示例,展示了接口在实际编码中的优势。

这里是修真院后端小课堂,每篇分享文从

八个方面深度解析后端知识/技能,本篇分享的是:

【为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?】

大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员

今天给大家分享一下,修真院官网Java任务1,深度思考中的知识点————为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

背景介绍

接口是以统一标准的目的,让大家都知道这个是做什么的,但是具体不用知道具体怎么做,可以理解为一个规范。

接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。

知识剖析

接口(interface)是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。

接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。

接口是一种100%纯抽象的类,是无法被初始化的类。

常见问题

为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

解决方案

(1)使用Interface是为了实现接口和实现类分离,对接口进行封装,这样一个接口可以对应多个实现类。

(2)同一个方法也可能不止一个类调用,这个时候用接口实现分离的方法可以减少代码重复率,耦合度更低。

(3)Impl是interface的实例,使用了Impl可以减少代码的重复率。

编码实战

一种是不使用接口的,一种是使用接口的,我们来比较一下

首先是共同部分:

(1)建表的SQL语句(我用到的是MySQL)

CREATE TABLE users (

id int(225) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

age int(225) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2)用到的jar包依赖(用到的是maven)

org.mybatis

mybatis

3.3.0

mysql

mysql-connector-java

5.1.29

junit

junit

4.12

(3)项目结构

(4)User.xml

package www.jnshu.com.po;

public class User {

//注意这里的属性名要与数据库中字段相同,否则获取不到值,同样不区分大小写

private long id;

private String name;

private int age;

public long get

以下是在Spring Boot项目中使用Java实现可上传多个图片的接口的代码,包含实体类、service、implservice、controller及代码注释。 ### 实体类(Entity层) ```java // 图片实体类,用于存储图片的相关信息 public class Image { // 图片的唯一标识 private String id; // 图片的名称 private String name; // 图片的存储路径 private String path; // 无参构造函数 public Image() { } // 有参构造函数 public Image(String id, String name, String path) { this.id = id; this.name = name; this.path = path; } // GetterSetter方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } } ``` ### Service层 ```java import org.springframework.web.multipart.MultipartFile; import java.util.List; // 图片上传服务接口 public interface ImageUploadService { // 上传多个图片的方法,返回上传成功的图片列表 List<Image> uploadImages(MultipartFile[] files); } ``` ### Service实现类(ImplService) ```java import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.UUID; // 图片上传服务实现类 @Service public class ImageUploadServiceImpl implements ImageUploadService { // 图片存储的基础路径,可根据实际情况修改 private static final String UPLOAD_DIR = "uploads/"; @Override public List<Image> uploadImages(MultipartFile[] files) { List<Image> uploadedImages = new ArrayList<>(); // 遍历上传的文件数组 for (MultipartFile file : files) { if (!file.isEmpty()) { try { // 生成唯一的文件名 String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename(); // 构建文件存储的完整路径 String filePath = UPLOAD_DIR + fileName; // 创建存储文件的目录 File dest = new File(filePath); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } // 将文件保存到指定路径 file.transferTo(dest); // 创建图片实体对象 Image image = new Image(UUID.randomUUID().toString(), fileName, filePath); // 将图片实体对象添加到上传成功的图片列表中 uploadedImages.add(image); } catch (IOException e) { e.printStackTrace(); } } } return uploadedImages; } } ``` ### Controller层 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.List; // 图片上传控制器 @RestController public class ImageUploadController { // 注入图片上传服务 @Autowired private ImageUploadService imageUploadService; // 处理上传多个图片的请求 @PostMapping("/uploadImages") public List<Image> uploadImages(@RequestParam("files") MultipartFile[] files) { // 调用服务层的上传方法 return imageUploadService.uploadImages(files); } } ``` ### 相关依赖 确保在`pom.xml`中添加以下依赖: ```xml <dependencies> <!-- Spring Boot Web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` ### 注意事项 - 上述代码中的`UPLOAD_DIR`是图片存储的基础路径,可根据实际情况修改。 - 要确保应用程序对该目录有读写权限。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值