切换语言为:繁体
通过一个项目讲清楚DO/PO/BO/AO/E/DTO/DAO/POJO/VO区别

通过一个项目讲清楚DO/PO/BO/AO/E/DTO/DAO/POJO/VO区别

  • 爱糖宝
  • 2024-07-09
  • 2060
  • 0
  • 0

在现代软件架构中,不同类型的类扮演着不同的角色,共同构成了一个清晰、模块化和可维护的系统。以下是对实体类(Entity)、数据传输对象(DTO)、领域对象(Domain Object)、持久化对象(Persistent Object)、业务对象(Business Object)、应用对象(Application Object)、数据访问对象(Data Access Object, DAO)、服务层(Service Layer)和控制器层(Controller Layer)的总体介绍

    不同领域作用

    POJO (Plain Old Java Object)

    • 定义:POJO 是一个简单的Java对象,它不继承任何特定的类或实现任何特定的接口,除了可能实现 java.io.Serializable 接口。它通常用于表示数据,不包含业务逻辑。

    • 案例的体现

      • UserEntity 类可以看作是一个POJO,因为它主要包含数据字段和标准的构造函数、getter和setter方法。

      • UserDTO 类也是一个POJO,它用于传输数据,不包含业务逻辑。

    VO (Value Object)

    • 定义:VO 是一个代表某个具体值或概念的对象,通常用于表示传输数据的结构,不涉及复杂的业务逻辑。

    VO(View Object)的特点:

    • 展示逻辑:VO通常包含用于展示的逻辑,例如格式化的日期或货币值。

    • 用户界面相关:VO设计时会考虑用户界面的需求,可能包含特定于视图的属性。

    • 可读性:VO可能包含额外的描述性信息,以提高用户界面的可读性。

    实体类(Entity)

    • 作用:代表数据库中的一个表,是数据模型的实现,通常与数据库表直接映射。

    • 使用场景:当需要将应用程序的数据持久化到数据库时使用。

    数据传输对象(DTO)

    • 作用:用于在应用程序的不同层之间传输数据,特别是当需要将数据从服务层传输到表示层或客户端时。

    • 使用场景:进行数据传输,尤其是在远程调用或不同服务间的数据交换时。

    领域对象(Domain Object)

    • 作用:代表业务领域的一个实体或概念,通常包含业务逻辑和业务状态。

    • 使用场景:在业务逻辑层处理复杂的业务规则时使用。

    持久化对象(Persistent Object)

    • 作用:与数据存储直接交互的对象,通常包含数据访问逻辑。

    • 使用场景:执行数据库操作,如CRUD(创建、读取、更新、删除)操作。

    业务对象(Business Object)

    • 作用:封装业务逻辑和业务数据,通常与领域对象交互。

    • 使用场景:在业务逻辑层实现业务需求时使用。

    应用对象(Application Object)

    • 作用:封装应用程序的运行时配置和状态,通常不直接与业务逻辑相关。

    • 使用场景:在应用程序启动或运行时配置时使用。

    数据访问对象(Data Access Object, DAO)

    • 作用:提供数据访问的抽象接口,定义了与数据存储交互的方法。

    • 使用场景:需要进行数据持久化操作时,作为数据访问层的一部分。

    服务层(Service Layer)

    • 作用:包含业务逻辑和业务规则,协调应用程序中的不同组件。

    • 使用场景:处理业务逻辑,执行业务用例。

    控制器层(Controller Layer)

    • 作用:处理用户的输入,调用服务层的方法,并返回响应结果。

    • 使用场景:处理HTTP请求和响应,作为Web应用程序的前端和后端之间的中介。

    案例介绍

    1. 用户注册

      • DTO:用户注册信息的传输。

      • Entity:用户信息在数据库中的存储形式。

      • Service Layer:验证用户信息、加密密码等业务逻辑。

    2. 商品展示

      • Entity:数据库中的商品信息。

      • DTO:商品信息的传输对象,可能包含图片URL等不需要存储在数据库的字段。

      • Service Layer:获取商品列表、筛选和排序商品等。

    3. 订单处理

      • Domain Object:订单的业务领域模型,包含订单状态等。

      • Business Object:订单处理的业务逻辑。

      • DAO:订单数据的持久化操作。

    4. 配置加载

      • Application Object:应用程序的配置信息,如数据库连接字符串。

    5. API响应

      • Controller Layer:处理API请求,调用服务层,返回DTO作为响应。

    案例代码

    视图对象(VO)

    一个订单系统,我们需要在用户界面展示订单详情:

    // OrderDTO - 数据传输对象
    public class OrderDTO {
        private Long id;
        private String customerName;
        private BigDecimal totalAmount;
        // Constructors, getters and setters
    }
    
    // OrderVO - 视图对象
    public class OrderVO {
        private Long id;
        private String customerFullName; // 格式化后的顾客姓名
        private String formattedTotal; // 格式化后的总金额,如"$1,234.56"
        private String orderDate; // 格式化后的订单日期
    
        // Constructors, getters and setters
    
        public OrderVO(OrderDTO dto) {
            this.id = dto.getId();
            this.customerFullName = formatName(dto.getCustomerName());
            this.formattedTotal = formatCurrency(dto.getTotalAmount());
            this.orderDate = formatDateTime(dto.getOrderDate());
        }
    
        private String formatName(String name) {
            // 实现姓名格式化逻辑
            return name;
        }
    
        private String formatCurrency(BigDecimal amount) {
            // 实现货币格式化逻辑
            return "$" + amount.toString();
        }
    
        private String formatDateTime(Date date) {
            // 实现日期时间格式化逻辑
            return new SimpleDateFormat("yyyy-MM-dd").format(date);
        }
    }

    实体类(Entity)

    package com.example.model;
    
    import javax.persistence.*;
    
    @Entity
    @Table(name = "users")
    public class UserEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(nullable = false, unique = true)
        private String username;
    
        @Column(nullable = false)
        private String password;
    
        // Constructors, getters and setters
        public UserEntity() {}
    
        public UserEntity(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    数据传输对象(DTO)

    package com.example.dto;
    
    public class UserDTO {
        private Long id;
        private String username;
    
        // Constructors, getters and setters
        public UserDTO() {}
    
        public UserDTO(Long id, String username) {
            this.id = id;
            this.username = username;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }

    领域对象(Domain Object)

    package com.example.domain;
    
    public class UserDomain {
        private Long id;
        private String username;
    
        // Business logic methods
        public UserDomain() {}
    
        public UserDomain(Long id, String username) {
            this.id = id;
            this.username = username;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        // Additional domain-specific methods
    }

    领域对象通常包含业务领域内的概念和逻辑。在订单系统中,这可能包括订单状态、订单项、总价等。

    package com.example.domain;
    
    import java.util.List;
    
    public class OrderDomain {
        private String orderId;
        private List<OrderItemDomain> items; // 订单项列表
        private double totalAmount;
        private OrderStatus status; // 订单状态
    
        // Constructors, getters and setters
    
        public OrderDomain(String orderId, List<OrderItemDomain> items) {
            this.orderId = orderId;
            this.items = items;
            this.totalAmount = calculateTotalAmount();
            this.status = OrderStatus.PENDING; // 默认状态为待处理
        }
    
        private double calculateTotalAmount() {
            double total = 0;
            for (OrderItemDomain item : items) {
                total += item.getPrice() * item.getQuantity();
            }
            return total;
        }
    
        // 业务逻辑方法,例如更新订单状态
        public void processPayment() {
            // 处理支付逻辑
            if (/* 支付成功条件 */) {
                this.status = OrderStatus.PAYMENT_COMPLETED;
            }
        }
    
        // 更多业务逻辑方法...
    }

    持久化对象(Persistent Object)

    package com.example.model;
    
    public class UserPersistent extends UserEntity {
        // Methods to interact with persistence layer, extending UserEntity
    }

    业务对象(Business Object)

    package com.example.service;
    
    public class UserBO {
        private UserDomain userDomain;
    
        public UserBO(UserDomain userDomain) {
            this.userDomain = userDomain;
        }
    
        // Business logic methods
        public void performBusinessLogic() {
            // Implement business logic
        }
    }

     OrderBO 业务对象通常封装业务逻辑,可能包含领域对象,并提供业务操作的方法。

    package com.example.service;
    
    import com.example.domain.OrderDomain;
    
    public class OrderBO {
        private OrderDomain orderDomain;
    
        public OrderBO(OrderDomain orderDomain) {
            this.orderDomain = orderDomain;
        }
    
        // 执行订单处理的业务逻辑
        public void performOrderProcessing() {
            // 例如,处理订单支付
            orderDomain.processPayment();
            // 其他业务逻辑...
        }
    
        // 更多业务逻辑方法...
    }

    应用对象(Application Object)

    package com.example.config;
    
    public class AppConfig {
        private String environment;
        private String configFilePath;
    
        public AppConfig() {
            // Initialize with default values or environment-specific settings
        }
    
        // Methods to handle application configuration
        public void loadConfiguration() {
            // Load configuration from files, environment variables, etc.
        }
    
        // Getters and setters
    }

    数据访问对象(Data Access Object)

    package com.example.dao;
    
    import com.example.model.UserEntity;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserDAO extends JpaRepository<UserEntity, Long> {
        // Custom data access methods if needed
        UserEntity findByUsername(String username);
    }

    OrderDAO DAO 提供数据访问的抽象接口,定义了与数据存储交互的方法。在Spring Data JPA中,可以继承JpaRepository并添加自定义的数据访问方法。

    package com.example.dao;
    
    import com.example.domain.OrderDomain;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface OrderDAO extends JpaRepository<OrderDomain, String> { // 主键类型为String
        // 自定义数据访问方法,例如根据订单状态查询订单
        List<OrderDomain> findByStatus(OrderStatus status);
    }

    服务层(Service Layer)

    package com.example.service;
    
    import com.example.dao.UserDAO;
    import com.example.dto.UserDTO;
    import com.example.model.UserEntity;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService {
        private final UserDAO userDAO;
    
        @Autowired
        public UserService(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
    
        public UserDTO getUserById(Long id) {
            UserEntity userEntity = userDAO.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
            return convertToDTO(userEntity);
        }
    
        private UserDTO convertToDTO(UserEntity entity) {
            UserDTO dto = new UserDTO();
            dto.setId(entity.getId());
            dto.setUsername(entity.getUsername());
            return dto;
        }
    
        // Additional service methods
    }

     OrderService服务层协调用户输入、业务逻辑和数据访问。它使用DAO进行数据操作,并可能使用业务对象来执行业务逻辑。

    package com.example.service;
    
    import com.example.dao.OrderDAO;
    import com.example.domain.OrderDomain;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class OrderService {
        private final OrderDAO orderDAO;
    
        @Autowired
        public OrderService(OrderDAO orderDAO) {
            this.orderDAO = orderDAO;
        }
    
        public List<OrderDomain> findAllOrders() {
            return orderDAO.findAll();
        }
    
        public OrderDomain getOrderById(String orderId) {
            return orderDAO.findById(orderId).orElseThrow(() -> new RuntimeException("Order not found"));
        }
    
        public void processOrderPayment(String orderId) {
            OrderDomain order = getOrderById(orderId);
            OrderBO orderBO = new OrderBO(order);
            orderBO.performOrderProcessing();
            // 更新订单状态等逻辑...
        }
    
        // 更多服务层方法...
    }

    控制器层(Controller Layer)

    package com.example.controller;
    
    import com.example.dto.UserDTO;
    import com.example.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/users")
    public class UserController {
        private final UserService userService;
    
        @Autowired
        public UserController(UserService userService) {
            this.userService = userService;
        }
    
        @GetMapping("/{id}")
        public UserDTO getUser(@PathVariable Long id) {
            return userService.getUserById(id);
        }
    
        // Additional controller endpoints
    }

    总结

    这些不同类型的类和层共同构成了一个分层的软件架构,每一层都有其特定的职责和功能。这种分层方法有助于降低系统的复杂性,提高代码的可维护性和可扩展性。通过将业务逻辑、数据访问和用户界面分离,开发人员可以独立地更新和测试每个部分,从而提高开发效率和应用程序的稳定性。

    0条评论

    您的电子邮件等信息不会被公开,以下所有项均必填

    OK! You can skip this field.