2024.3.18 JAVA编程的三层架构模式理解

2024.3.18 JAVA编程的三层架构模式理解

三层架构

controller:控制层,接收前端发送的请求。对请求进行处理,并响应数据。

service:业务逻辑层,处理具体的业务逻辑数据。

dao:数据访问层(Data Access Object),即持久层,负责数据的增、删、改、查。

案例代码

下面的例子对三层架构比较清晰。在这个示例代码中,首先定义了一个 usernames.txt 文件,通过读取文件模拟整个程序的运行过程。该文件中存储了多个用户名,每行一个用户名。UserDaoImpl 类中的 getUserNameById 方法通过读取该文件,并返回指定行的用户名作为模拟的数据。然后在 Main 类中调用 getUserNameById 方法来获取指定行的用户名,并输出结果。了解三层分工后就比较好理解三层架构了。

dao层

主要用于实现如何从后端的数据库/文件读取数据的功能,同时也可以执行数据的增、删、改、查。

复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

// UserDao.java
public interface UserDao {
    String getUserNameById(int userId);
}


// UserDaoImpl.java
public class UserDaoImpl implements UserDao {
    private static final String FILE_PATH = "usernames.txt";

    @Override
    public String getUserNameById(int userId) {
        try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            int count = 0;
            while ((line = br.readLine()) != null) {
                count++;
                if (count == userId) {
                    return line;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

service层

主要用于实现数据的处理逻辑,本处仅用于演示数据没有进行处理。

复制代码
// UserService.java
public interface UserService {
    String getUserNameById(int userId);
}


// UserServiceImpl.java
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public String getUserNameById(int userId) {
        return userDao.getUserNameById(userId);
    }
}

control层

主要用于实现与前端交互,本处仅用于演示没有进行编写。

复制代码
// Main.java
public class Main {
    public static void main(String[] args) {
        UserDao userDao = new UserDaoImpl();
        UserService userService = new UserServiceImpl(userDao);

        // 测试功能
        int userId = 3; // 假设要获取第三个用户名
        String userName = userService.getUserNameById(userId);
        if (userName != null) {
            System.out.println("User Name: " + userName);
        } else {
            System.out.println("User not found");
        }
    }
}
相关推荐
虫小宝43 分钟前
返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
分布式·架构·rabbitmq
梦中的天之酒壶2 小时前
多级缓存架构
缓存·架构
眠りたいです3 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
虫小宝5 小时前
返利软件的分布式缓存架构:Redis集群在高并发场景下的优化策略
分布式·缓存·架构
一水鉴天5 小时前
整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之6 拼句 之1 (豆包助手 之8)
架构·认知科学
纪元A梦5 小时前
Redis最佳实践——安全与稳定性保障之高可用架构详解
redis·安全·架构
Dontla5 小时前
流行的前端架构与后端架构介绍(Architecture)
前端·架构
熊文豪6 小时前
KingbaseES读写分离集群架构解析
数据库·架构·kingbasees·金仓数据库·电科金仓
往事随风去6 小时前
别再纠结了!IM场景下WebSocket和MQTT的正确选择姿势,一文讲透!
后端·websocket·架构
爱读源码的大都督7 小时前
为什么Spring 6中要把synchronized替换为ReentrantLock?
java·后端·架构