数据访问对象模式(Data Access Object Pattern):电商平台商品管理实战案例分析
肖哥弹架构 跟大家“弹弹” 业务中设计模式的使用,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
在电商平台中,商品信息的存储和检索是核心业务之一。数据访问对象模式(DAO)提供了一个抽象层,用于访问和操作数据,而不暴露数据源的具体细节。
历史热点文章
- 外观模式(Facade Pattern):微服务架构中的数据库访问实战案例分析
- 代理模式(Proxy Pattern):权限校验API调用实战案例分析
- 桥接模式(Bridge Pattern):多样式用户界面组件实战案例分析
- 组合模式(Composite Pattern): 在线教育平台课程管理实战案例分析
2. 为什么要使用数据访问对象设计模式
DAO模式将数据访问逻辑与业务逻辑分离,使得数据访问代码易于维护和扩展,同时简化了单元测试。
3. 标准数据访问对象设计模式图
4. 业务数据访问对象设计模式图
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接口实现。
总结
数据访问对象模式为数据访问提供了一个清晰和一致的抽象,使得数据访问逻辑集中、易于管理和扩展。
历史热点文章
- 享元模式(Flyweight Pattern):网页游戏中的角色对象管理实战案例分析
- 观察者模式(Observer Pattern):股票交易系统实战案例分析
- 策略模式(Strategy Pattern):电商平台的优惠券系统实战案例分析
- 模板方法模式(Template Method Pattern):视频播放应用实战案例分析
- 命令模式(Command Pattern):网络爬虫任务队列实战案例分析
- 迭代器模式(Iterator Pattern):电商平台商品分类浏览实战案例分析
- 中介者模式(Mediator Pattern):即时通讯软件实战案例分析
- 备忘录模式(Memento Pattern):游戏存档系统实战案例分析
- 状态模式(State Pattern):电商平台订单状态管理实战案例分析
- 责任链模式(Chain of Responsibility Pattern):电商平台的订单审批流程实战案例分析
- 访问者模式(Visitor Pattern):电商平台商品访问统计实战案例分析
- 工厂方法模式(Factory Method Pattern): 电商多种支付实战案例分析
- 抽象工厂模式(Abstract Factory Pattern):多风格桌面应用实战案例分析
- 建造者模式(Builder Pattern): 在线订单系统实战案例分析
- 原型模式(Prototype Pattern): 云服务环境配置实战案例分析
- 适配器模式(Adapter Pattern):第三方支付集成实战案例分析
- 装饰器模式(Decorator Pattern):电商平台商品价格策略实战案例分析
- 单例模式(Singleton Pattern):购物车实战案例分析
转载自:https://juejin.cn/post/7389440983802544155