当前位置: 首页 > news >正文

设计模式、系统设计 record part01

技术路线:

工程师==》设计师==》分析师==》架构师

管理路线:

项目经理==》技术经理


工程师:

编程技术、测试技术

设计师:

工程师+设计技术

分析师:

设计师+分析技术

架构师:

分析师+架构技术


项目经理:

时间管理、风险管理、计划管理、过程管理、成本管理、人际沟通

技术经理:

项目经理+领导能力


具备技术素质:

高级技术人才

具备管理素质:

高级管理人才

同时具备技术、管理素质:

高级综合人才

参考书推荐:
head first design patterns(设计模式)
大话设计模式(Java溢彩加强版)
图解设计模式(中国工薪出版集团、人民邮电出版社)


在这里插入图片描述
在这里插入图片描述
前辈们代码设计经验,解决特定问题的一系列套路


好的、坏的设计特征
在这里插入图片描述
Robert C.Martin


向对的设计原则:
在这里插入图片描述


单一职责-Single Responsibility Principle:

在这里插入图片描述
职责《== 原因,应该有且仅有一个原因,引发类的变更
功能 约等于 方法
在这里插入图片描述
仅有一个原因,引发类的变更,
根据这个案例,如果只设计了一个类(员工类),那么,诱发类的变更就有很多原因,
比如要修改收银员的数据就要动这个员工类,要修改接待员的数据也要动这个员工类,要修改厨师的数据也要动这个员工类,所以出现了修改这个员工类会有n个原因,这就违反了SRP,
所以改进的方法是,为每一个工种设置一个类,这样,当要去动某个类的时候,只有一个与其对应的原因,
比如要修改餐服员的数据,只要去动餐服员的类就行,而不需要去管其他工种的类。
这里可以使用粒度这个词来描述职责,
多职责的粒度就是粗的,
单一职责的粒度就是细的。
在这里插入图片描述
DAO(Data Access Object)
把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间,
Entity层,顾名思义就是实体层,放置一个个实体,及其相应的set、get方法。
如果想要对数据库进行一些操作(比如说读取)的话,就要先写entity层
Service被称作业务逻辑层。
顾名思义,它处理逻辑上的业务,而不去考虑具体的实现
Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
Util是utiliy的缩写,是一个多功能、基于工具的包。
如字符串处理、日期处理等,(建立数据库之间的连接),是通用的、与业务无关的,可以独立出来,可供其他项目使用
在这里插入图片描述


开闭-Open Closed Principle:

在这里插入图片描述
在这里插入图片描述
开闭的关键是抽象,
开闭是面向对象设计的终极目标,
开放是,对程序中需求频繁变化部分进行抽象。


里氏替代-Liskov Substitution Principles:
在这里插入图片描述
在这里插入图片描述


依赖倒置-Dependence Inversion Priciple:

在这里插入图片描述
依赖正置: 面向实现。模块之间的依赖,依赖的是实现类
依赖倒置: 面向抽象。模块之间的依赖,依赖抽象

在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
依赖倒转的中心思想是面向接口编程(这句话的意思就是,把具体的 n 个实现抽象成 1 个接口,1:n 【 n 个实现类】到 1:1【 1 个接口】)
以抽象的基础搭建的架构比以细节为基础的架构要稳定的多,
抽象不应该依赖细节,细节应该依赖抽象
接口或抽象类,不涉及任何具体的操作,把展现细节的任务交给接口(或抽象类)的实现类去完成
在这里插入图片描述
september2024the26Thursday

依赖正置,一个类a去引用其他的类(类b、类c),
依赖倒置,针对类b、类c,抽象出来一个接口,类b、类c都继承(implement)这个接口,然后类a去引用这个接口,这就是倒置,
换句话说,打个比方,正置的时候,类a直接去和类b、类c吵架,倒置的时候,类a骂的是类b、类c的爸爸(接口),所以是倒过来的,是指爹骂(不是直接骂儿子,骂的是爹【引用类b、类c的爹】,让儿子自己去体会【类b、类c去 implement 继承它们的爹】)儿子,
正置的时候,类a要去挨个引用其他类,
倒置的时候,类a只引用一个接口,n多的其他类去自动继承接口,这样类a不用关心继承接口的有多少个其他类,只要这些类都继承类a引用的那个接口,类a就能使用这些个类。


接口分离-Interface Segregation Principle:

在这里插入图片描述
在这里插入图片描述
可以看到,上图中,将打电话、发短信、拍照三个方法集成到一起了,这时候,apple手机有能力使用它的三个功能,而老年机实际上并不需要拍照功能,但开发的时候是将三个功能集成到一起了,这时候,老年机用户就被迫依赖了一个并不需要的拍照方法,
解决办法:
把打电话、发短信、拍照做成3个接口,iPhone就调用3个接口,老年机就调用除了拍照以外的打电话、发电信这两个接口,
在这里插入图片描述
不要强迫老年机用户依赖他们并不需要的摄像头拍照方法,


迪米特-Law of Demeter:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,需要变动的模块的扩展会相对容易。
再举一个例子:
军队里面有元帅、军官和士兵,元帅认识军官,军官认识自己管辖的士兵。
要发动攻击,元帅不必直接对士兵下命令,只需要下命令给军官,再由军官将指令转发给所辖士兵即可。


合成复用-Composite Reuse Priciple:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面这个例子说的是,继承父类时能拿到父类的方法method1、method2,但是拿不到父类的其他子类的方法,因此是不能重用父类的子类的代码,
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
举个栗子:
我在csdn‘程序员胖虎’的博客里找到几个图,看起来比较好理解,如下:
继承
在这里插入图片描述
给继承加元素.
在这里插入图片描述
合成
在这里插入图片描述
给合成加元素,
在这里插入图片描述
合成的扩展性更好些。
找了一圈,‘程序员胖虎’的这个似乎更贴切些,咱们先用着,有时间我再研究研究,又更好的再来更新。
再来一个例子:
来自csdn‘这很张扬’的博客,下图是一个合成复用的图
在这里插入图片描述
下面是一个继承复用的图在这里插入图片描述
再举一个例子:
在这里插入图片描述
一个父类,如下:
在这里插入图片描述
父类里有两个方法,method1、method2,
子类1,如下:
在这里插入图片描述
复写了父类的method2,变成了它自己的方法method2
子类2,如下:
第3个子类,如下:
在这里插入图片描述
复写了父类的method1、method2,变成了自己的method1、method3,
最后,用一个测试类进行测试,如下:
在这里插入图片描述
测试类,结果如下:
在这里插入图片描述
最后这个例子不太好,给人感觉莫名其妙的,不妙不妙,我再想想,等有更好的例子再来更新。

September2024the26thWednesday

相关文章:

设计模式、系统设计 record part01

技术路线: 工程师》设计师》分析师》架构师 管理路线: 项目经理》技术经理 工程师: 编程技术、测试技术 设计师: 工程师设计技术 分析师: 设计师分析技术 架构师: 分析师架构技术 项目经理: 时间…...

服务器与普通电脑的区别是什么?

服务器作为企业进行线上业务所使用的网络设备,大多数的用户对于服务器都有一定的了解,而普通的电脑则是人们在进行日常娱乐活动中经常会用到的设备,本文就来探讨一下服务器与普通电脑之间的区别是什么吧! 普通的电脑就是我们通常所…...

Vue3学习(六)Vue3 + ts几种写法

前言 官网提到组合式api和选项式api 选项式api其实就是vue2的写法&#xff0c;组合式api是vue3的新写法&#xff08;组合式api可以在script中使用setup&#xff08;&#xff09;也可以使用<script setup>&#xff0c;<script setup>是setup&#xff08;&#xff…...

【前端】ES6:Proxy代理和Reflect对象

文章目录 1 Proxy代理1.1 get方法1.2 set方法1.3 has方法1.4 this问题 2 Reflect对象2.1 代替Object的某些方法2.2 修改某些Object方法返回结果2.3 命令式变为函数行为2.4 配合Proxy 1 Proxy代理 Proxy如其名&#xff0c;它的作用是在对象和和对象的属性值之间设置一个代理&am…...

基于微信开发助手企鹅音乐微信小程序的设计与实现(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

学习Spring Boot,应该从哪里开始学起

文章目录 前言1. Java基础2. Spring框架基础3. Spring Boot入门4. 搭建Spring Boot项目5. 编写RESTful API6. 数据库操作7. 安全性和测试8. 部署和运维9. 实践和项目总结前言 学习Spring Boot,应该从哪里开始学起 学习Spring Boot,你可以从以下几个步骤开始学起: 1. Java基…...

【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题

前言&#xff1a; &#x1f308;上期博客&#xff1a;【后端开发】JavaEE初阶—线程安全问题与加锁原理&#xff08;超详解&#xff09;-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 ⭐️小编会在后端开发的学习中不断更新~~~ &#…...

企微群管理软件:构建高效社群运营的新引擎

在数字化营销日益盛行的今天&#xff0c;企业微信&#xff08;简称“企微”&#xff09;群作为企业与用户直接互动的重要平台&#xff0c;其管理与运营效率直接关系到企业的品牌形象、用户满意度及市场影响力。企微群管理软件&#xff0c;作为专为企微社群设计的高效管理工具&a…...

CORE 中间件、wwwroot

ASP.NET Core中间件组件是被组装到应用程序管道中以处理HTTP请求和响应的软件组件&#xff08;从技术上来说&#xff0c;组件只是C&#xff03;类&#xff09;。 ASP.NET Core应用程序中的每个中间件组件都执行以下任务。 选择是否将 HTTP 请求传递给管道中的下一个组件。这可…...

SpringBoot 与 Maven 快速上手指南

SpringBoot 与 Maven 快速上手指南 在Java开发领域&#xff0c;Spring Boot和Maven是两个极其重要的工具&#xff0c;它们极大地简化了企业级应用的开发和构建过程。Spring Boot通过自动配置和起步依赖等特性&#xff0c;让开发者能够快速搭建起一个Spring应用&#xff1b;而M…...

大觅网之自动化部署(Automated Deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...

【C++】入门基础知识-1

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 目录 前言&#xff1a; C关键字 命名空间 命名空间介…...

Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型

通用命令 get() / set() 这是Redis中两个最为核心的命令。 set插入 这里的key 和 value都是字符串&#xff0c;我们可以加双引号 或者单引号&#xff0c;或者不加。 get查找 如果查询的key值不存在&#xff0c;那么会返回一个 nil &#xff0c;也就是代表空 在Redis中命令…...

使用电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、VSCode、ESP32C3)

文章目录 Wokwi 简介安装客户端&#xff08;Mac/Linux&#xff09;创建 Token Arduino IDEVSCode 配置安装 wokwi 插件打开编译后目录 ESP32C3 示例Arduino IDE创建模拟器运行模拟器 Wokwi 简介 Wokwi 是一款在线电子模拟器。您可以使用它来模拟 Arduino、ESP32、STM32 以及许…...

C嘎嘎入门篇:类和对象(1)

前言&#xff1a; 小编在之前讲述了C的部分入门基础&#xff0c;读者朋友一定要掌握好那些&#xff0c;因为C的学习和C有点不同&#xff0c;C的知识都是比较连贯的&#xff0c;所以我们学好了前面才可以学习后面的内容&#xff0c;本篇文章小编将会讲述C真正的入门篇&#xff1…...

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包&#xff0c;并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…...

unity_Occlusion_Culling遮挡剔除学习

unity_Occlusion_Culling遮挡剔除学习 文档&#xff1a; https://docs.unity.cn/cn/2019.4/Manual/occlusion-culling-getting-started.html没彻底搞明白&#xff0c;但是会用&#xff0c;虽然也不熟练 设置遮挡剔除 打开遮挡剔除面板 设置场景物体。设置为静态 设置场景 烘…...

vue初学随笔

Vue基础 Vue基本概念 Vue是什么 Vue是一个渐进式的JavaScript框架&#xff0c;它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 渐进式&#xff1a;各个特性可以根据项目需要逐渐引入和…...

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范&#xff08;Java Bean Validation&#xff0c;简称 JSR 380&#xff09;&#xff0c;它并没有具体的实现&#xff0c;它的常用实现&#xff0c;是hibernate-validator。…...

微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程

前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...