oomall课堂笔记

 一、项目分层结构介绍

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中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之Maven仓库的详细解析

2.3 Maven仓库 仓库:用于存储资源,管理各种jar包 仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(就是jar包)和插件 Maven仓库分为: 本地仓库:自己计算机上的一个目录(用来存储jar包) 中央仓库&a…

利用R语言heatmap.2函数进行聚类并画热图

数据聚类然后展示聚类热图是生物信息中组学数据分析的常用方法,在R语言中有很多函数可以实现,譬如heatmap,kmeans等,除此外还有一个用得比较多的就是heatmap.2。最近在网上看到一个笔记文章关于《一步一步学heatmap.2函数》,在此与…

python 涉及opencv mediapipe知识,眨眼计数 供初学者参考

基本思路 我们知道正面侦测到人脸时,任意一只眼睛水平方向上的两个特征点构成水平距离,上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时,垂直距离与水平距离的比值基本恒定 根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个…

主动而非被动:确保网络安全运营弹性的途径

金融部门处理威胁的经验对网络安全领域的任何人都有启发——没有什么可以替代提前摆脱潜在的风险和问题。 从狂野西部的银行劫匪到勒索软件即服务 (RaaS),全球金融生态系统面临的威胁多年来发生了巨大变化。技术进步带动了金融业的快速发展,从现金交易到…

【开放集检测OSR】open-set recognition(OSR)开集识别概念辨析

开放集学习 Openset Learning 主动学习 Active Learning 例外检测 Out-of-Distribution open-set recognition(OSR)开集识别 anomaly detection和outlier detection 文章目录 OOD检测OSR开放集识别OSR开放集识别在训练和测试阶段的数据集使用数据分布似然函数OSR开放集识别的特…

2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则

今天分享的人工智能系列深度研究报告:《2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则》。 (报告出品方:M&CSAATCHITHINKS) 报告共计:11页 生成型人工智能的兴起和重要性 生成式…

Dockerfile介绍

1. DockerFile介绍 dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤: 1、编写一个dockerfile文件 2、docker build 构建成为一个镜像 3、docker run运行镜像 4、docker push发布镜像(DockerHub、阿里云镜像仓库…

开源MES/免费MES/开源MES生产流程管理

一、什么是MES生产管理流程 生产管理系统(又称制造执行系统)是一种集成了计划、生产、质量控制、库存管理和材料申请等生产流程的管理系统。工厂生产管理流程是企业中实现高效生产的重要一环。 二、工厂生产管理流程的步骤 步骤一:计划和排…

利用reddit的api进行爬虫

1 介绍 Reddit是一个社交新闻聚合网站,用户可以发布、评价和讨论各种话题。Reddit的内容涵盖了广泛的主题,可以从中获取大量的文本数据进行情绪分析。 2 注册 2.1 注册reddit 你需要先注册一个reddit的账号。 2.2 注册api https://www.reddit.com/…

[RK-Linux] 移植Linux-5.10到RK3399(四)| 检查HDMI配置与打开内核LOGO显示

文章目录 一、HDMI二、VOP三、显示内核LOGO一、HDMI RK3399 的 HDMI 接口如图: datasheet 介绍: HDMI 接口各个引脚的作用如下: 接口标签作用HDMI_TX0P HDMI_TX0PA差分信号线,用于传输 HDMI 通道 0 的正向数据HDMI_TX0N HDMI_TX0NA

ELK(三)—安装可视化工具

目录复制 目录 一、ElasticSearch-Head可视化工具介绍1.1特性:1.2用法: 二、安装2.1docker安装2.2Chrome插件安装 一、ElasticSearch-Head可视化工具介绍 ElasticSearch-Head 是一个基于浏览器的 Elasticsearch 可视化工具,它提供了一个直观…

C#大型LIS检验信息系统项目源码

LIS系统,一套医院检验科信息系统。它是以数据库为核心,将实验仪器与电脑连接成网,基础功能包括病人样本登录、实验数据存取、报告审核、打印分发等。除基础功能外,实验数据统计分析、质量控制管理、人员权限管理、试剂出入库等功能…

甘草书店:#9 2023年11月23日 星期四 「麦田创业历程分享1——联合创始人的魔幻相遇」

既然甘草是一家创业主题的书店咖啡馆,那就从我,从麦田开始分享一下创业历程吧。 需要声明的是,我从不认为我有资格对别人的创业指指点点,每位创业者的性格、背景、基础、诉求各有不同,时代发展也日新月异,…

Apache Flink(九):集群基础环境搭建-Centos7节点配置

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

【Vue】修改组件样式并动态添加样式

文章目录 目标修改样式动态添加/删除样式样式不生效 目标 使用组件库中的组件,修改它的样式并动态添加/删除样式。 修改样式 组件中的一些类可能添加样式无法生效。如Element Plus中的Timeline 时间线 | Element Plus (element-plus.org)。 假设想修改两个圆之间…

K8S 删除命令空间时 一直卡住怎么办?

当使用完一个命名空间后,想删除了又删除不掉,这个时候查看命名空间的状态一直是Terminating。使用强制删除,也是还是不行。(找了好多办法都不行) [rootk8s-master kubernetes-yaml]# kubectl delete ns mem-example Er…

Numpy数组的创建(第1讲)

Numpy数组的创建 (第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ&#x1f…

【GAMES101】三维变换

games101的第四节课讲了三维变换和观察变换,我们这里先记录一下三维变换的知识,后面再讲观察变换 齐次坐标下的三维变换 类似于解决之前二维变换平移的问题,三维变换下用齐次坐标通过增加一个维度来表示,第四个维度为1表示这是个…

Leetcode—213.打家劫舍II【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—213.打家劫舍II 算法思路 实现代码 class Solution { public:// 左闭右开int rob1(vector<int>& nums, int start, int end) {int n nums.size();int f0 0, f1 0, new_f 0;for(int i start; i < end…

C++ day58 每日温度 下一个更大元素

题目1&#xff1a;739 每日温度 题目链接&#xff1a;每日温度 对题目的理解 temperature[i]表示每天的温度&#xff0c;返回数组answer&#xff0c;answer[i]指对于第i天&#xff0c;下一个更高温度最近出现在几天后&#xff0c;如果气温在这之后都不会升高&#xff0c;用0…