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

电商设计模式总结

在这里插入图片描述

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.rhkb.cn/news/147654.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【React】组件实例三大属性state、props、refs

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

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

目录 1. ZooKeeper 面试题&#xff1f; 2. ZooKeeper 提供了什么&#xff1f; 3. Zookeeper 文件系统 4. ZAB 协议&#xff1f; 5. 四种类型的数据节点 Znode 6. Zookeeper Watcher 机制 -- 数据变更通知 7. 客户端注册 Watcher 实现 8. 服务端处理 Watcher 实现 9. 客…

CharacterEncodingFilter的用法

CharacterEncoding是SpringMVC提供的一个一个过滤器,用于设置请求和响应的字符编码,解决乱码问题,他本身是一个过滤器 那么在SpringBoot中,CharacterEncoding就有一个很好的秒用 setEncoding("UTF-8")设置编码 setForceEncoding(true) 设置请求和响应编码 还需要在配…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

《C和指针》笔记30:函数声明数组参数、数组初始化方式和字符数组的初始化

文章目录 1. 函数声明数组参数2. 数组初始化方式2.1 静态初始化2.2 自动变量初始化 2.2 字符数组的初始化 1. 函数声明数组参数 下面两个函数原型是一样的&#xff1a; int strlen( char *string ); int strlen( char string[] );可以使用任何一种声明&#xff0c;但哪个“更…

.balckhoues-V-XXXXXXX勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 勒索病毒已经成为网络犯罪者最喜爱的武器之一。其中&#xff0c;.balckhoues-V-XXXXXXX勒索病毒以其阴险的特性而著称。本文91数据恢复将深入探讨这个神秘的数字威胁&#xff0c;解析它的工作原理&#xff0c;以及如何保护自己免受其侵害。如果您正在经历勒索…

JavaWeb项目:smbms(mysql)

1.准备工作&#xff0c;创建数据库 CREATE DATABASE smbms;USE smbms;CREATE TABLE smbms_address (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,contact VARCHAR(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 联系人姓名,addressDesc VARCHAR(50) COLLATE u…

【Linux】线程详解完结篇——信号量 + 线程池 + 单例模式 + 读写锁

线程详解第四篇 前言正式开始信号量引例信号量的本质信号量相关的四个核心接口生产消费者模型用环形队列实现生产者消费者模型基于环形队列的生产消费模型的原理代码演示单生产者单消费者多生产者多消费者 计数器的意义 线程池基本概念代码 单例模式STL,智能指针和线程安全STL中…

Springboot——关于Springboot线程池时使用ThreadLocal 类的一个小小的漏洞

问题描述 前端的使用ajax发送了一个请求到后端 后端自定义了一个线程上下文和实现了一个拦截器Interceptor public class BaseContext {public static ThreadLocal<Integer> threadLocal new ThreadLocal<>();public static void setCurrentId(int id) {threadL…

克服网络安全压力:如何掌控无限的云数据

管理云中的数字风险比以往任何时候都更加重要。数字化转型引发的云数据呈指数级增长&#xff0c;为安全分析师创造了一个更大的威胁环境。随着威胁行为者继续危害组织最敏感的数据&#xff0c;这一挑战将会加剧。 预计未来五年全球网络犯罪成本将激增&#xff0c;从 2022 年的…

Java笔记六(面向对象:类与对象)

面向对象编程的本质&#xff1a;以类的方式组织代码&#xff0c;以对象的组织&#xff08;封装&#xff09;数据 抽象 三大特征&#xff1a;封装 继承 多态 从认识角度考虑是先有对象后有类。对象&#xff0c;是具体的事物。类&#xff0c;是抽象的&#xff0c;是对对象的抽…

Ubantu 20.04 卸载与安装 MySQL 5.7 详细教程

文章目录 卸载 MySQL安装 MySQL 5.71.获取安装包2.解压并安装依赖包3.安装 MySQL4.启动 MySQL 扩展开启 gtid 与 binlog 卸载 MySQL 执行以下命令即可一键卸载&#xff0c;包括配置文件目录等。 # 安装sudo软件 apt-get install sudo -y # 卸载所有以"mysql-"开头的…

stable diffusion学习笔记【2023-10-2】

L1&#xff1a;界面 CFG Scale&#xff1a;提示词相关性 denoising&#xff1a;重绘幅度 L2&#xff1a;文生图 女性常用的负面词 nsfw,NSFW,(NSFW:2),legs apart, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, (…

古记事法:Windows 下 16 位汇编环境搭建指南(DOSBox-X 篇)

文章目录 参考环境DOSBox-XWOWWindows On Windows 产生的原因Windows On Windows 的工作原理WOW16 的结束与 WOW64 的未来 在现代操作系统中运行 16 位应用程序DOSBox-X 16 位汇编环境的搭建应用准备挂载自动挂载dosbox-x.conf配置工具 参考 项目描述搜索引擎Bing、GoogleAI 大…

CV面试知识点总结

一.卷积操作和图像处理中的中值滤波操作有什么区别&#xff1f; 1.1卷积操作 卷积操作是一种线性操作&#xff0c;通常用于特征的提取&#xff0c;通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文&#xff1a; https://blog.csdn.net/weixin_51571728/article/detai…

传输层协议——TCP、UDP

目录 1、UDP 协议&#xff08;用户数据报协议&#xff09; 协议特点 报文首部格式 2、TCP 协议&#xff08;传输控制协议&#xff09; 协议特点 报文首部格式 TCP连接建立时的三次握手 TCP拆除连接的四次挥手 TCP的流量控制 TCP的拥塞控制 3、传输层端口号 三类端口…

1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

项目完整版在&#xff1a; 文章目录 一、channel模块&#xff1a;事件管理Channel类实现二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、代码&#xff08;一&#xff09;框架&#xff08;二…

腾讯云服务器哪个配置比较值得?

腾讯云服务器哪款配置比较好值得买&#xff1f;轻量应用服务器性价比值得买&#xff0c;轻量2核2G3M带宽95元一年、2核4G5M带宽218元一年、2核2G4M带宽三年540元一年、4核8G12M配置446元一年、8核16G18M带宽1668元15个月、16核32G28M轻量服务器3468元15个月。腾讯活动入口&…

Git多账号管理通过ssh 公钥的方式,git,gitlab,gitee

按照目前国内访问git&#xff0c;如果不科学上网&#xff0c;我们很大可能访问会超时。基于这个&#xff0c;所以我现在的git 配置已经增加到了3个了 一个公司gitlab&#xff0c;一个git&#xff0c;一个gitee. 以下基于这个环境&#xff0c;我们来说明下如何创建配置ssh公钥。…

多线程 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…