oomall课堂笔记

news2025/1/18 16:56:09

 一、项目分层结构介绍

controller层(控制器层):

作用:负责输出和输入,接收前端数据,把结果返回给前端。

1.处理用户请求,接收用户参数

2.调用service层处理业务,返回响应

service层(业务逻辑层):

1.封装业务逻辑,为controller层提供服务

2.调用dao层或mapper层处理数据。

3.总控,所有事物的切入点

dao层(数据访问层):

1.主要职责是对数据库进行增删改查,不包含业务逻辑,直接与数据库交互。

ps(传统是:dao层和service层的代码是功能性的,是一个个函数,service去调用dao层,bo是作为值在传递,只有get和set方法)。

(满血模型,service变成了协调者。把service层一个方法中的代码切割成bo对象中若干个方法。把代码块分得更小。更自然容易理解重用性提高。)

dao层负责生成bo对象,bo对象用于承接service层分配的任务。

mapper层:

主要职责:数据存储或获取数据。

mapper层负责访问具体数据。

ps1:mapper层和controller层和面向对象没太多关系。主要战场是在service和dao层。

ps2:oomall是六边形体系结构,沿用了mvc体系结构,强调领域模型(bo),应用(service),尽量要让领域模型部分变得肥大,尽量把service和dao层代码放到bo中,把尽可能多的代码放到其中。

颜色的具体含义:

白色存在mysql数据库,蓝色表示从其它部分拿到的,黄色表示存在mongo数据库,绿色部分是全用java写的代码。

调用逻辑:

用户请求发送到controller层,controller层去调用service层,service层调用dao层或mapper层,从数据库返回数据。

二、dto、vo、bo、po介绍

dto(data transfer object)数据传输对象:【controller层】

用于服务层之间数据传输。

包含数据对象,主要是变量定义和get、set方法。

dto可以封装需要传输的数据。

vo(view object)视图对象:【controller层】

用于controller层和前端数据传输。

同样包含数据对象,主要是变量定义和get、set方法。

在controller层将数据传递给前端展示。

bo(business object)业务对象:【dao层】

封装业务逻辑中的数据。

包含业务逻辑。

包含业务逻辑的数据以及与这些数据相关的业务方法。

po(persistent object)持久化对象:【mapper层】

用于表示数据库中的一条记录,与数据库表结构对应

po通常与数据库表中字段一一对应

一般用在mapper层或dao层与数据库交互

oomall项目特点:包含业务逻辑的bo对象写在了dao层中,称之为满血模型。

三、设计模式

3.1 创建者

对象A由谁创建。

如果B包含A(整体和局部关系,如组合关系。比如上级地区创建下级地区。),B记录A,B用到A,B有A的初始化数据,则由对象B创建对象A。

3.2 信息专家

问题:分配职责给对象的基本原则是什么?

“知者为之”谁具备完成职责所需的信息,就由谁来承担职责。

比如:api的分配

3.3 模板方法设计模式

模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或总行为的方法。

基本方法是实现算法各个步骤的方法。

写在父类中的填空题,子类不同会给空填上不同内容。

3.4 策略模式

定义一系列算法,把它们封装在对象内部,并且可以任意替换。

最好在变化点使用,为了将系统和变化点松耦合,将变化点从代码中提出。用多态方式实现不同的子类,以便日后增加新算法。

老师例子:shop模块的打包算法。用策略模式把会变化的点抽离出来,用了低耦合和多态,让其满足依赖倒置原则和Liskov可替换原则,使得算法部分满足面向对象的终极目标开闭原则。

3.5 桥接器模式

将问题分解成独立的两个部分,任意组合形成最后的解决方案。

四、软件设计的七大原则

1.开闭原则

对于扩展开放,对修改关闭。

每一次的修改不会动到已有的代码,不会影响已有代码,已经写好的代码都不用动,想扩展,不需要去动其它代码。

不论新增还是修改影响面都很小,修改只波及到一小部分代码。

抽象(新设一个抽象接口,把所有的接口都统一到该接口上)、约束(多态),封装、变化(间接)

判断点和演进点,可能会修改的地方,使用开闭原则。

2.Liskov可替换原则

继承必须确保超类所拥有的性质在子类中仍然成立(父类和子类)。

这意味着去overwrite父类的方法时,不能去随意overwrite,必须要让父类具备的性质在子类中依然成立。

不能违背父类中的性质,父类有的性质在子类中依然有,子类可以加入自己的性质。

满足Liskov替换原则必然满足开闭原则。

继承是耦合度很高的行为,Liskov替换原则要求继承不能修改父类的行为。

3.依赖倒置原则(激进)

面向接口编程,不面向实现编程。

高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。(人说的话就是要做接口,依赖接口)。

4.单一职责原则(激进)

一个类有且仅有一个引起它变化的原因,否则类应该被拆分。

职责:每一个业务的方法,把职责分配给一个对象。

5.接口隔离原则(激进)

客户端不应该被迫依赖于它不使用的方法。(人话说:接口不能对应有它不需要的方法,要把接口拆分为多个小接口,然后逐个依赖,直到形成原子性的,完美的配对)

6.迪米特原则(激进)

不跟“陌生人”说话,只与你的直接朋友交谈。

如果两个软件实体无需直接通信,就不应该发生直接的相互调用,可以通过第三方转发该调用。

7.合成复用原则(激进)

优先考虑组合或聚合等关联关系来实现,其次才考虑继承关系实现。

五、region模块

4.1 使用模式:

创建者+信息专家

4.2 知识点:

— 缓存只在service和dao对象中做,bo对象不做缓存。

— 缓存不存相同东西。

— 动态模型是面向对象的血和肉,动态模型是顺序图,静态模型是类图。

— exception分支不会测到,所有分支都要测到。从功能角度去测试。

4.3 阅读源码:

— 1.如何创建对象。2.如何增和查(createregion,findbyid)。3.看dao层代码如何缓存(regionservice,region(getparentregion,getancestor,changestatus))。

— 要看javaee缓存的知识

4.4 模块结构:

controller【dtp】【vo】

dao【bo】

mapper【po】

4.5 流程图分析:

1、2、3、8是面向功能的,因为此时还没有对象。

service层职责分配,如何把要实现的功能交给不同部分去做。service外面向功能,service内面向对象。增删改等第1步要做的是变出对象。

以后只画从service层开始到dao层结束。

dao层提供对象。

loop循环10代表10级行政区,

六、payment模块

4.1 使用模式:

工厂方法+适配器模式

4.2 知识点:

— 做判断时机的标准是,如果当前已有信息足够进行判断,则进行判断。

— 如果报红要编译一下compile

— redis的操作是在core/mapper/redisUtil下

— openfeign借用了controller中所有的注解,定义了自身去调其它平台的接口,用restful风格。

— controller是定义了别人来调我们应该提供一个什么样的restful风格。

— 多态:共性的放在父类里,个性的放在子类里。(有子类的类是父类,父类有子类共性的属性)。

— 值对象:不是满血对象,只有值。

4.3 阅读源码:

— 1.阅读一下登录授权的代码,关注AOP。2.dao层channeldao的代码。

— 要看javaee微服务的知识。

4.4 模块结构:

config:

controller:【dto】【vo】

dao:【bo】【channel】

mapper:【generator】【manual】【openfeign】

service:

channel是支付渠道。

generator是自动生成的代码,mannual是自己写的代码。

openfeign(基于restful的api)是外部接口。

4.5 流程图分析:

第3步创建者,第6步adaptor是一个适配器接口,满足间接和多态,满足可替换达成开闭,遵循依赖倒置,不满足接口隔离(所有接口合在一起),第5步取出的是满血对象。

七、shop模块

4.1 使用模式:

策略模式+桥接器模式

4.2 知识点:

— 当要求插入数据不重复时,可以直接利用mysql的唯一索引的特性。

— 商铺和模板原本是一对多,现在对象模型变成一对一,只记默认模板计算运费。

— 父类白色,子类黄色,把对象一劈两半,一般存mysql,一半存mongo,拿到运费模板要看到底下所有地区,nosql只支持主键查询功能,不能直接看到运费模板下所有主键,要在mysql中记录nosql中所有的主键,索性把共用属性也放到mysql中。nosql的好处是能将数据量搞到最大。

— 订单模块订单的数量级很大,所以在订单要用mongo,在大数量的前提下,用mongo的查询和插入速度会快。

4.3 阅读源码:

1.RegionTemplateDao中的insert函数。weightTemplateDao的insert函数。

4.4 模块结构:

config

controller【dto】【vo】:

dao【bo】【openfeign】【template】

mapper【openfeign】【po】

service【listener】

service中listener中存放的是MQ的内容。bo对象分为两个包,白色在根目录底下,黄色在template底下,绿色在divide底下;和mongo有关的放在template下,无关的放在根目录下。openfeign因为有调region模块,写在mapper下。

4.5 流程图分析:

用了多态的方法去支持两种模板类型,分为运费模板和重量模板,定义了虚拟的接口:

八、product模块

4.1 使用模式:

4.2 知识点:

— 

— 

— 

— 

4.3 阅读源码:

4.4 模块结构:

config

controller【dto】【vo】

dao【activity】【bo】【onsale】【openfeign】

mapper【jpa】【mongo】【openfeign】【po】

model【strategy】

service【listener】

4.5 流程图分析:

写代码思路:

1.先理清选做部分,各个模块间的调用关系。

2.从比较简单和孤立的部分开始。

注意事项:面向对象一定要新建对象。

service

AddressService难

CartService中

couponcreateService易

couponservice难

customerservice难

shareservice中

successshareservice中

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

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

相关文章

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…

【Linux】已安装 powerlevel10k,报错 command not found: p10k

问题描述 在配置 zsh 时&#xff0c;已经安装了 powerlevel10k&#xff0c;但是当尝试启动 Powerlevel10k 配置向导时&#xff0c;出现了以下错误&#xff1a; p10k configure zsh: command not found: p10k原因分析 出现这个错误的原因是因为 zsh 终端还没有加载最新的配置…

Kafka性能调优:高吞吐、低延迟的数据流

Apache Kafka作为一种高性能、分布式流处理平台&#xff0c;对于实时数据的处理至关重要。本文将深入讨论Kafka性能调优的关键策略和技术&#xff0c;通过丰富的示例代码为大家提供实际操作指南&#xff0c;以构建高吞吐、低延迟的数据流系统。 Broker 配置的优化 首先&#…

[全志Tina/Linux]全志在线生成bootlogo工具

一、需求 由于全志的bootlogo文件要求使用bmp格式的32位RGBA图像&#xff0c;经测试在使用不同版本的ps软件修图时&#xff0c;导出的bootlogo.bmp经常无法被全志uboot识别&#xff0c;因此使用在线工具转换。 二、操作 1、登录工具网站 https://online-converting.com/ima…

C++面试宝典第3题:找不同的数

题目 封装两个函数&#xff0c;分别完成下面的编码任务。 &#xff08;1&#xff09;在一个整型数组中&#xff0c;数字都是两两相同&#xff0c;只有一个不同&#xff0c;请编写代码&#xff0c;最快找出这个不同的数字。 &#xff08;2&#xff09;在一个整型数组中&#xff…

力扣78. 子集(java 回溯解法)

Problem: 78. 子集 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们易知&#xff0c;本题目涉及到对元素的穷举&#xff0c;即我们可以使用回溯来实现。对于本题目我们应该较为注重回溯中的决策阶段&#xff1a; 由于涉及到对数组中元素的穷举&#xff0c;即在每…

1、Redis变慢原因排查(上)

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上) Redis 作为一款业内使用率最高的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单节点的QPS压测能达到18万以上。但也正因此如此&#xff0c;当应用访问 Redis 时&#xff0c;如果发现响应延迟变…

Docker架构及常用的命令

一、初识Docker 1、 docker是一个快速交付应用、运行应用的技术&#xff0c;具备下列优势&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以…

Redis保证高可用的三种方式

Redis保证高可用主要有三种方式&#xff1a;主从、哨兵、集群。 主从复制了解吗&#xff1f; Redis主从复制简图 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为 主节点(master)&#xff0c;后者称为 从节点(slave)。且…

用Rust刷LeetCode之66 加一

66. 加一[1] 难度: 简单 func plusOne(digits []int) []int { length : len(digits) // 从最低位开始遍历&#xff0c;逐位加一 for i : length - 1; i > 0; i-- { if digits[i] < 9 { digits[i] return digits } d…

计算整数各位数字之和 C语言xdoj29

时间限制: 1 S 内存限制: 1000 Kb 问题描述: 假设n是一个由最多9位数字&#xff08;d9, …, d1&#xff09;组成的正整数。编写一个程序计算n的每一位数字之和 输入说明: 输入数据为一个正整数n 输出说明: 对整数n输出它的各位数字之和后换行 输入样例: …

排序算法——桶排序/基数排序/计数排序

桶排序 是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理&#xff1a; 假设输入数据服从均匀分布&#xff0c;将数据分到有限数量的桶里&#xff0c;每个桶再分别排序&#xff08;有可能再使…

C/C++,数字序列——计算伯努利数(Bernoulli Number)的计算方法与源程序

1 文本格式 typedef long long ll; const int maxn 10000; const int mod 1e9 7; ll B[maxn]; // 伯努利数 ll C[maxn][maxn]; // 组合数 ll inv[maxn]; // 逆元&#xff08;计算伯努利数&#xff09; void init() { // 预处理组合数 for (int i 0;…

PHPstudy小皮的数据库打开失败问题解决

如果你的MYSQL服务启动后停止&#xff0c;多次重启依然无法解决的情况下&#xff0c;大概率是和本地mysql冲突了 但是&#xff0c;千万不要卸载掉本地mysql&#xff0c;只需要在服务中停止本地mysql即可 将此服务关闭&#xff0c;小皮的mysql即可使用

AI助力智慧农业,基于DETR【DEtection TRansformer】模型开发构建田间作物场景下庄稼作物、杂草检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候&#xff0c;我总是倾向于极简构建&#xff0c;一切没有必要的软件包都不安装&#xff0c;以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难&#xff0c;如在日常查询、排查问题的时候发现很多命令用不了&#xff0c;不得不在容器中安装额外的命令…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成&#xff0c;Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件&#xff08;Object File&#xff09;。 目标文件和可执行文件一般采用同一种格式&#xff0c;这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…

【PCB设计】嘉立创EDA器件3D模型导入AD的方法

嘉立创EDA器件3D模型导入AD的方法 一、嘉立创EDA导出3D模型二、CAD编辑3D模型三、AD中加载3D模型 一、嘉立创EDA导出3D模型 在嘉立创EDA中找到对应的元器件&#xff0c;并生成PCB&#xff0c;选择导出3D文件 导出元件step模型 二、CAD编辑3D模型 用FreeCAD打开模型 删除…

SpringSecurity(一)

【第一篇】SpringSecurity的初次邂逅 1.Spring Security概念 Spring Security是Spring采用 AOP思想&#xff0c;基于 servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。 Spring Security是一个功能强大且高度可定制的身…

Linux——操作系统与进程的基础概念

操作系统与进程的基础概念 本章思维导图&#xff1a; 注&#xff1a;思维导图对应的.xmind和.png文件都已同步导入至资源 1. 操作系统&#xff08;OS&#xff09; 操作系统的基本概念&#xff1a; 操作系统(operator system)简称OS&#xff0c;是一个管理软硬件资源的软件 1.…