Java 接口的定义重构学生管理系统

重构目标:将系统的核心操作抽象为接口,从而解耦业务逻辑与具体实现。后续可以轻松替换存储方式(如从内存换成数据库)或增加新功能

  1. 定义核心接口

```java

// 学生实体类

public class Student {

private String id;

private String name;

private int age;

// 构造方法、getter/setter 省略

}

// 学生管理接口 - 定义所有对外提供的操作

public interface StudentService {

boolean addStudent(Student student);

boolean deleteStudent(String id);

boolean updateStudent(Student student);

Student findStudentById(String id);

List<Student> findAllStudents();

}

```


  1. 基于内存的实现(原有系统可能长这样)

```java

// 原来的实现:直接使用 ArrayList,业务代码与具体存储耦合

public class MemoryStudentManager {

private List<Student> students = new ArrayList<>();

public boolean addStudent(Student s) { ... }

public Student findStudentById(String id) { ... }

// ...

}

```


  1. 重构:让实现类实现接口

```java

// 重构后:实现 StudentService 接口

public class MemoryStudentService implements StudentService {

private List<Student> students = new ArrayList<>();

@Override

public boolean addStudent(Student student) {

if (findStudentById(student.getId()) != null) {

return false; // 已存在

}

return students.add(student);

}

@Override

public boolean deleteStudent(String id) {

return students.removeIf(s -> s.getId().equals(id));

}

@Override

public boolean updateStudent(Student student) {

Student old = findStudentById(student.getId());

if (old == null) return false;

old.setName(student.getName());

old.setAge(student.getAge());

return true;

}

@Override

public Student findStudentById(String id) {

return students.stream()

.filter(s -> s.getId().equals(id))

.findFirst()

.orElse(null);

}

@Override

public List<Student> findAllStudents() {

return new ArrayList<>(students);

}

}

```


  1. 使用接口编程(客户端代码)

```java

public class StudentManagementSystem {

private StudentService studentService;

// 通过构造方法注入具体的实现(依赖注入)

public StudentManagementSystem(StudentService studentService) {

this.studentService = studentService;

}

public void showAllStudents() {

studentService.findAllStudents().forEach(System.out::println);

}

// 其他业务方法...

}

// 主程序

public class Main {

public static void main(String[] args) {

// 只需替换这一行,就可以切换存储方式

StudentService service = new MemoryStudentService();

// StudentService service = new DatabaseStudentService(); // 未来扩展

StudentManagementSystem system = new StudentManagementSystem(service);

system.addStudent(new Student("1", "张三", 20));

system.showAllStudents();

}

}

```


  1. 重构带来的好处

方面 重构前(具体类) 重构后(接口)

扩展性 要换存储方式必须修改大量代码 新增 DatabaseStudentService 即可,符合开闭原则

测试性 单元测试必须依赖真实的列表 可以传入 Mock 实现,便于隔离测试

可维护性 业务逻辑与存储细节混杂 接口清晰定义了契约,实现者各司其职

多态性 不支持多种管理策略 可以用同一个 StudentManagementSystem 配合不同实现


  1. 接口定义中的进阶设计(可选)

你还可以在接口中添加默认方法或静态方法,提供公共逻辑:

```java

public interface StudentService {

// 核心抽象方法 ...

// 默认方法:检查学生是否成年

default boolean isAdult(Student student) {

return student.getAge() >= 18;

}

// 静态方法:创建默认的内存实现

static StudentService newMemoryInstance() {

return new MemoryStudentService();

}

}

```

使用时:StudentService service = StudentService.newMemoryInstance();


总结

通过接口的定义,将学生管理系统的操作契约与具体实现分离。这是面向对象设计中的面向接口编程原则,也是 Spring 等框架的核心思想。重构后的系统可以轻松应对需求变化(如从内存存储改为数据库存储),同时极大提升了代码的可测试性和可维护性。

相关推荐
Albert Edison2 小时前
【RabbitMQ】快速入门
java·分布式·rabbitmq
阿Y加油吧2 小时前
栈的经典应用:从「有效括号」到「寻找两个正序数组的中位数」深度解析
开发语言·python·算法
ch.ju2 小时前
Java程序设计(第3版)第二章——类型转换(1)
java
XiYang-DING2 小时前
【Java】哈希
java·哈希算法·散列表
ai旅人2 小时前
Guava RateLimiter深度解析:非阻塞令牌桶限流原理与跑批实战
java·限流·guava
xiaotao1312 小时前
阶段零:Python 安装与虚拟环境(venv / Conda)
开发语言·人工智能·python·conda
Seven972 小时前
【从0到1构建一个ClaudeAgent】规划与协调-技能
java
dr_yingli2 小时前
fMRI(4-1)统计分析报告生成器说明
开发语言·matlab
阿Y加油吧2 小时前
二分查找进阶:旋转排序数组的两道经典题深度解析
数据结构·算法