image.png

肖哥弹架构 跟大家“弹弹” 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在电商平台中,商品信息的存储和检索是核心业务之一。数据访问对象模式(DAO)提供了一个抽象层,用于访问和操作数据,而不暴露数据源的具体细节。

历史热点文章

2. 为什么要使用数据访问对象设计模式

DAO模式将数据访问逻辑与业务逻辑分离,使得数据访问代码易于维护和扩展,同时简化了单元测试。

3. 标准数据访问对象设计模式图

image.png

4. 业务数据访问对象设计模式图

image.png

5. 业务代码参考

import java.util.*;
import java.util.stream.Collectors;

// 商品实体
class Product {
    private String id;
    private String name;
    private double price;

    // Constructors, getters and setters

    public Product(String id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

// 商品数据访问对象接口
interface ProductRepository {
    List<Product> findAllProducts();
    Optional<Product> findProductById(String id);
    void saveProduct(Product product);
    void deleteProduct(String id);
}

// 商品数据访问对象内存实现
class InMemoryProductRepository implements ProductRepository {
    private final Map<String, Product> products = new HashMap<>();

    @Override
    public List<Product> findAllProducts() {
        return new ArrayList<>(products.values());
    }

    @Override
    public Optional<Product> findProductById(String id) {
        return Optional.ofNullable(products.get(id));
    }

    @Override
    public void saveProduct(Product product) {
        products.put(product.getId(), product);
    }

    @Override
    public void deleteProduct(String id) {
        products.remove(id);
    }
}

// 商品服务
class ProductService {
    private ProductRepository productRepository;

    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public List<Product> getAllProducts() {
        return productRepository.findAllProducts();
    }

    public Product getProductById(String id) {
        return productRepository.findProductById(id).orElseThrow(() -> new NoSuchElementException("Product not found with id: " + id));
    }

    public void addProduct(Product product) {
        productRepository.saveProduct(product);
    }

    public void updateProduct(Product product) {
        if (!productRepository.findProductById(product.getId()).isPresent()) {
            throw new NoSuchElementException("Product not found with id: " + product.getId());
        }
        productRepository.saveProduct(product);
    }

    public void deleteProduct(String id) {
        productRepository.deleteProduct(id);
    }
}

// 客户端使用示例
public class ECommerceApplication {
    public static void main(String[] args) {
        ProductRepository repository = new InMemoryProductRepository();
        ProductService productService = new ProductService(repository);

        // 添加商品
        productService.addProduct(new Product("1", "手机", 2999.00));

        // 获取所有商品
        productService.getAllProducts().forEach(System.out::println);

        // 获取单个商品
        productService.getProductById("1").forEach(System.out::println);

        // 更新商品
        productService.updateProduct(new Product("1", "新款手机", 3299.00));

        // 删除商品
        productService.deleteProduct("1");
    }
}
6. 使用数据访问对象设计模式的好处
  • 解耦合:DAO模式将数据访问逻辑与业务逻辑分离,降低它们之间的耦合度。
  • 易于维护:数据访问代码集中管理,便于维护和更新。
  • 可测试性:可以针对DAO单独编写单元测试。
7. 其他使用数据访问对象设计模式场景参考
  • 用户信息管理:在用户管理系统中,使用DAO模式进行用户数据的增删改查。
  • 订单数据处理:电商平台的订单数据管理。
8. 可参考开源框架
  • MyBatis:一个流行的Java持久层框架,它提供了简单的DAO接口实现。
总结

数据访问对象模式为数据访问提供了一个清晰和一致的抽象,使得数据访问逻辑集中、易于管理和扩展。

历史热点文章