电商项目常用的五个设计模式场景及分析实现

电商设计模式总结

在这里插入图片描述

1 单点登录模

1 业务介绍

单点登录(Single Sign-On, SSO)模块允许用户在多个相关应用系统之间进行无缝的身份验证。用户只需登录一次,然后可以访问所有连接的应用程序而无需重新登录。在电商应用中,这对于提供一致性用户体验非常重要。

2 实现介绍

**单例模式(Singleton Pattern)**是一种创建型设计模式,它确保类只有一个实例,并提供一个全局访问点。在单点登录模块中,我们选择使用单例模式来管理已登录用户的状态。这是因为我们需要在不同的应用组件中共享用户的登录状态,而且不希望多次实例化登录管理器。

public class LoginManager {// 私有静态内部类确保线程安全的延迟初始化private static class SingletonHelper {private static final LoginManager INSTANCE = new LoginManager();}private Map<Integer, Boolean> loggedInUsers;private LoginManager() {loggedInUsers = new HashMap<>();}public static LoginManager getInstance() {return SingletonHelper.INSTANCE;}public void login(int userId) {loggedInUsers.put(userId, true);}public void logout(int userId) {loggedInUsers.remove(userId);}
}

设计模式说明

  • 单例模式被用来确保系统中只有一个LoginManager实例。这是因为登录状态需要全局管理,多个实例会导致数据不一致性。单例模式通过静态内部类方式实现了懒加载,确保了线程安全。

2 商品详情模块

1 业务介绍

商品详情模块负责展示商品的详细信息,包括商品描述、价格、评价等。在电商应用中,这个模块允许用户深入了解商品,从而做出购买决策。

2 实现介绍

**装饰器模式(Decorator Pattern)**是一种结构性设计模式,允许你通过将对象包装在装饰器类中来动态地为对象添加新的行为。在商品详情模块中,我们使用装饰器模式来动态地添加商品的价格信息和评价信息。

// 基本商品接口
public interface Product {String getDescription();
}// 基本商品类
public class BasicProduct implements Product {@Overridepublic String getDescription() {return "Basic product description";}
}// 商品装饰器抽象类
public abstract class ProductDecorator implements Product {protected Product product;public ProductDecorator(Product product) {this.product = product;}
}// 价格信息装饰器
public class PriceDecorator extends ProductDecorator {public PriceDecorator(Product product) {super(product);}@Overridepublic String getDescription() {return product.getDescription() + " with price information";}
}// 评价信息装饰器
public class ReviewDecorator extends ProductDecorator {public ReviewDecorator(Product product) {super(product);}@Overridepublic String getDescription() {return product.getDescription() + " with reviews";}
}

设计模式说明

  • 装饰器模式允许我们在运行时动态地为对象添加新的行为,而不需要修改其代码。在商品详情模块中,BasicProduct是基本的商品类,而PriceDecoratorReviewDecorator是装饰器,可以用来添加价格信息和评价信息。

3 订单模块

1 业务介绍

订单模块负责处理用户购物车中的商品、生成订单、支付、发货等流程。在电商应用中,订单模块是用户购买商品和完成交易的关键部分。

2 实现介绍

**工厂模式(Factory Pattern)**是一种创建型设计模式,它提供了一种将对象的创建与其使用分离的方法。在订单模块中,我们使用工厂模式来根据订单类型创建不同类型的订单。

// 订单接口
public interface Order {double calculateTotal();
}// 常规订单类
public class RegularOrder implements Order {@Overridepublic double calculateTotal() {return 100.0;}
}// 促销订单类
public class PromoOrder implements Order {@Overridepublic double calculateTotal() {return 80.0;}
}// 订单工厂类
public class OrderFactory {public Order createOrder(String orderType) {switch (orderType.toLowerCase()) {case "regular":return new RegularOrder();case "promo":return new PromoOrder();default:throw new IllegalArgumentException("Invalid order type.");}}
}

设计模式说明

  • 工厂模式用于封装对象的创建逻辑。在订单模块中,OrderFactory负责根据订单类型创建不同类型的订单对象。这种方式使得新增订单类型变得容易,而不需要修改已有的代码。

通过上述详细实现和设计模式的选择,我们建立了一个具有良好扩展性和可维护性的电商应用。设计模式有助于提高代码的可读性和可维护性,并将业务逻辑与底层实现分离,使系统更加灵活和可维护。

当在电商项目中使用观察者模式和策略模式时,以下是包含详细实现代码的综合说明:

4 观察者模式(Observer Pattern)

1 业务介绍:

观察者模式用于维护对象之间的一对多依赖关系。在电商项目中,这一模式适用于实时通知用户关于商品价格和库存的变化,确保他们随时获得最新信息。

实现介绍

import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 具体主题类
class Product implements Subject {private List<Observer> observers = new ArrayList<>();private double price;public void setPrice(double price) {this.price = price;notifyObservers();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(price);}}
}// 观察者接口
interface Observer {void update(double price);
}// 具体观察者类
class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(double price) {System.out.println(name + " 收到通知:商品价格更新为 $" + price);}
}// 示例用法
public class ObserverPatternExample {public static void main(String[] args) {Product product = new Product();User user1 = new User("Alice");User user2 = new User("Bob");product.registerObserver(user1);product.registerObserver(user2);product.setPrice(50.0);product.setPrice(55.0);}
}

说明

  • 观察者模式实现了解耦合,商品不需要直接知道哪些用户关注它,而用户也不需要主动轮询商品的状态。
  • 这种模式有助于电商平台实时向用户提供最新信息,提高了用户体验和客户忠诚度。

5 策略模式(Strategy Pattern)

1 业务介绍:

策略模式允许在运行时选择算法或策略,使客户端能够灵活地切换不同的行为。在电商项目中,策略模式可以用于处理不同的支付方式,如信用卡支付、支付宝支付、微信支付等。

实现介绍

// 支付策略接口
interface PaymentStrategy {void pay(double amount);
}// 具体支付策略类
class CreditCardPayment implements PaymentStrategy {private String cardNumber;private String name;public CreditCardPayment(String cardNumber, String name) {this.cardNumber = cardNumber;this.name = name;}@Overridepublic void pay(double amount) {System.out.println("支付 $" + amount + " 到 " + name + " 的信用卡 " + cardNumber);}
}class PayPalPayment implements PaymentStrategy {private String email;public PayPalPayment(String email) {this.email = email;}@Overridepublic void pay(double amount) {System.out.println("通过 PayPal 支付 $" + amount + " 到 " + email);}
}// 订单类使用策略模式
class Order {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(double totalAmount) {paymentStrategy.pay(totalAmount);}
}// 示例用法
public class StrategyPatternExample {public static void main(String[] args) {Order order = new Order();// 选择信用卡支付order.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432", "Alice"));order.checkout(100.0);// 切换到 PayPal 支付order.setPaymentStrategy(new PayPalPayment("alice@example.com"));order.checkout(75.0);}
}

说明

  • 策略模式将支付方式的选择和订单处理逻辑分离,订单对象不需要关心具体的支付细节。
  • 客户端可以根据需要选择不同的支付策略,从而实现支付方式的灵活切换,而不需要修改订单处理代码。

这两个设计模式的综合应用在电商项目中提供了良好的可维护性和可扩展性,同时满足了实时通知和支付方式灵活切换的需求。根据项目需求,可以继续探索其他设计模式来解决不同的业务问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148896.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

互联网Java工程师面试题·Dubbo篇·第一弹

目录 1、为什么要用 Dubbo&#xff1f; 2、Dubbo 的整体架构设计有哪些分层? 3、默认使用的是什么通信框架&#xff0c;还有别的选择吗? 4、服务调用是阻塞的吗&#xff1f; 5、一般使用什么注册中心&#xff1f;还有别的选择吗&#xff1f; 6、默认使用什么序列化框架&…

堆排序——向下调整

之前我们要想实现堆排序&#xff0c;是运用建堆代码来实现的&#xff1a; 向上调整建堆——向下调整排序 那么去我们可不可以只适用一种调整方法&#xff08;向下调整&#xff09;就能实现这样的功能呢&#xff1f; 向要只使用向下调整就实现堆排序 首先就是把数组里的值使用…

uboot启动流程-uboot内存分配工作总结

一. uboot 启动流程 _main 函数中会调用 board_init_f 函数&#xff0c;本文继续简单分析一下 board_init_f 函数。 本文继续具体分析 board_init_f 函数。 本文继上一篇文章的学习&#xff0c;地址如下&#xff1a; uboot启动流程-uboot内存分配_凌肖战的博客-CSDN博客 二…

全志ARM926 Melis2.0系统的开发指引④

全志ARM926 Melis2.0系统的开发指引④ 编写目的7. 固件打包脚本7.1.概要描述7.2.术语定义7.2.1. makefile7.2.2. image.bat 7.3.工具介绍7.4.打包步骤7.4.1. makefile 部分7.4.2. image.bat 部分 7.5.问题与解决方案7.5.1. 固件由那些文件构成7.5.2. melis100.fex 文件包含什么…

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…

力扣 -- 96. 不同的二叉搜索树

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int numTrees(int n) {vector<int> dp(n1);//初始化dp[0]1;//填表for(int i1;i<n;i){for(int j1;j<i;j){//状态转移方程dp[i](dp[j-1]*dp[i-j]);}}//返回值return dp[n];} }; 你学会了吗&…

【C语言】循环结构程序设计 (详细讲解)

前言&#xff1a;前面介绍了程序中常常用到的顺序结构和选择结构&#xff0c;但是只有这两种结构是不够的&#xff0c;还有用到循环结构(或者称为重复结构)。因为在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。 【卫卫卫的代码仓库】 【选择结构】 【专栏链…

GEO生信数据挖掘(三)芯片探针ID与基因名映射处理

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 处理一个探针对应多个基因 1.删除该行 2.保留分割符号前面的第一个基因 处理多个探针对应一个基因 详细代码案例一删除法 详细代码案例二 多个基因名时保留第一个基因名…

vs code 离线安装 CodeLLDB 包[Acquiring CodeLLDB platform package]

1. 问题描述 最近在配置使用vscode编译c&#xff0c;一打开vscode就弹出以下信息“Acquiring CodeLLDB platform package” 2. 问题原因 vscode在安装CodeLLDB插件时&#xff0c;速度太慢&#xff0c;一直不能成功 3. 解决方案&#xff1a; 离线下载 CodeLLDB插件&#xff0c…

一文读懂UTF-8的编码规则

之前写过一篇文章“一文彻底搞懂计算机中文编码”里面只是介绍了GB2312编码知识&#xff0c;关于utf8没有涉及到&#xff0c;经过查询资料发现utf8是对unicode的一种可变长度字符编码&#xff0c;所以再记录一下。 现在国家对于信息技术中文编码字符集制定的标准是《GB 18030-…

开源python双屏图片浏览器软件

源代码 需要安装pyqt5这个库 # -*- coding: utf-8 -*-from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QPushButton, QFileDialog, QAction, QSlider, QHBoxLayout, QWidget from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt, QS…

新手学习笔记-----⽂件操作

目录 1. 为什么使⽤⽂件&#xff1f; 2. 什么是⽂件&#xff1f; 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件&#xff1f; 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 ⽂件指针 4.3 ⽂件的打开和关闭 5. ⽂件的顺序读写 …

YOLOv5、YOLOv8改进:RepVGG结构

1.简介 论文参考&#xff1a;最新RepVGG结构: Paper 我们所说的“VGG式”指的是&#xff1a; 没有任何分支结构。即通常所说的plain或feed-forward架构。 仅使用3x3卷积。 仅使用ReLU作为激活函数。 主要创新点为结构重参数化。在训练时&#xff0c;网络的结构是多分支进…

认知智能最新研究成果

声明&#xff1a;以下内容仅代表个人对现象和本质探索&#xff0c;不代表对学术成果评价。曾有幸和马文明斯基的学生段老师和方老师一起讨论过人工智能问题。随着自己对问题进一步理解&#xff0c;刚好18年左右开始接触认知智能理论核心认知计算部分。 第一&#xff1a;算法是一…

[Spring] Spring5——AOP 简介

目录 一、AOP 简介 1、什么是 AOP 二、AOP 底层原理 1、动态代理原理 2、基于接口的 JDK 动态代理 3、基于继承的 CGLib 动态代理 三、底层原理实现—— JDK 动态代理 1、使用 Proxy 类的方法创建代理对象 2、JDK 动态代理示例 四、AOP 操作术语 1、连接点 2、切入…

获取医疗器械板块的个股列表

获取医疗器械板块的个股列表&#xff0c;用python爬虫做到&#xff08;数据网址&#xff1a;板块 - 医疗器械概念 - 股票行情中心 - 搜狐证券&#xff09; import requests from bs4 import BeautifulSoup # 获取医疗器械概念个股列表url "https://q.stock.sohu.com/cn/…

vivado杂项记录

文章目录 问题的解决Xilinx Vitis 启动时未响应的解决方法Spawn failed&#xff1a;No error错误vivado卡在Initializing Language Server的解决方法vivado中添加文件后出现non-module 其他关于MAX_FANOUT属性vviado 2018.3中IP的core container 问题的解决 Xilinx Vitis 启动…

一文拿捏Spring事务之、ACID、隔离级别、失效场景

1.&#x1f31f;Spring事务 1.编程式事务 事务管理代码嵌入嵌入到业务代码中&#xff0c;来控制事务的提交和回滚&#xff0c;例如TransactionManager 2.声明式事务 使用aop对方法前后进行拦截&#xff0c;然后在目标方法开始之前创建或者加入一个事务&#xff0c;执行完目…

python机器学习基础教程02-鸢尾花分类

初识数据 from sklearn.datasets import load_irisif __name__ __main__:iris_dataset load_iris()print("数据集的键为:\n{}".format(iris_dataset.keys()))# DESCR 数据集的简要说明print(iris_dataset[DESCR][:193])# target_names 数组对应的是我们要预测的花…

CCF CSP认证 历年题目自练Day21

题目一 试题编号&#xff1a; 201909-1 试题名称&#xff1a; 小明种苹果 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 题目分析&#xff08;个人理解&#xff09; 先看输入&#xff0c;第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题&#xf…