设计模式--开篇
什么是设计模式
设计模式是软件开发过程中面临的通用问题的解决方案。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
按使用目的分类
创建型–主要用于创建对象
- 单例模式-某个类只能有一个实例,提供一个全局的访问点
- 工厂方法模式-创建对象而不将创建逻辑暴露给客户端
- 抽象工厂-也称为工厂的工厂,由一个工厂创建其他工厂
- 建造者-封装一个复杂对象的构建过程,并可以按步骤构造
- 原型-通过复制现有的实例来创建新的实例
行为型–主要用于描述对类或对象怎样交互和怎样分配职责
- 访问者—在不改变数据结构的前提下,增加作用于一组对象元素的新功能
- 模板方法 --定义一个算法结构,而将一些步骤延迟到子类实现
- 策略 --定义一系列算法,把他们封装起来,并且使它们可以相互替换
- 状态 --允许一个对象在其对象内部状态改变时改变它的行为
- 观察者(事件发布订阅模式) --对象间的一对多的依赖关系
- 备忘录 --在不破坏封装的前提下,保持对象的内部状态
- 中介者 --用一个中介对象来封装一系列的对象交互
- 迭代器 --一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构
- 解释器 --给定一个语言,定义它的文法的一种表示,并定义一个解释器
- 命令 --将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
- 责任链–将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会
结构型–主要用于处理类或对象的组合
- 适配器–将一个类的方法接口转换成客户希望的另外一个接口
- 桥接模式–将抽象部分和它的实现部分分离,使它们都可以独立的变化
- 组合模式–将对象组合成树形结构以表示“部分-整体”的层次结构
- 装饰器–动态的给对象添加新的功能
- 外观—对外提供一个统一的方法,来访问子系统中的一群接口
- 享元模式–通过共享技术来有效的支持大量细粒度的对象
- 代理模式–为其他对象提供一个代理以便控制这个对象的访问
按使用范围分类
类模式–处理类和子类之间的关系,这些关系通过继承建立
- 工厂方法模式
- 类-适配器
- 模板方法
- 解释器
对象模式–处理对象间的关系,这些关系在运行时刻变化
- 抽象工厂
- 建造者
- 原型
- 单例模式
- 对象-适配器
- 桥接模式
- 组合模式
- 装饰器
- 外观
- 享元模式
- 代理模式
- 责任链
- 命令
- 迭代器
- 中介者
- 备忘录
- 观察者
- 状态
- 策略
- 访问者
设计模式六大原则
单一原则
一个类只负责一项职责,尽量做到类只有一个行为原因引起变化;
业务对象(BO business object)、业务逻辑(BL business logic)拆分
里氏替换原则
子类可以扩展父类的功能,但不能改变原有父类的功能;
目的:增强程序的健壮性。实际项目中,每个子类对应不同的业务含义,使父类作为参数,传递不同的子类完成不同的业务逻辑
依赖倒置原则
面向接口编程;(通过接口作为参数实现应用场景)
依赖于抽象而不依赖于具体。
抽象就是接口或者抽象类,细节就是实现类
依赖倒置原则定义:
上层模块不应该依赖下层模块,两者应依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口负责定义public属性和方法,并且申明与其他对象依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑
接口隔离
建立单一接口;(扩展为类也是一种接口,一切皆接口)。
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度。
降低依赖,降低耦合。
定义:
客户端不应该依赖它不需要的接口;
类之间依赖关系应该建立在最小的接口上
迪米特原则
最少知道原则,尽量降低类与类之间的耦合;
一个对象应该对其他对象有最少的了解,
即一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立
开闭原则
用抽象构建架构,用实现扩展原则;
开闭原则就是说对扩展开放,对修改关闭。
一个软件实体通过扩展来实现变化,而不是通过修改原来的代码来实现变化。
实现一个热插拔的效果。
开闭原则是对软件实体的未来事件而制定的对现行开发设计进行约束的一个原则
相关文章:
设计模式--开篇
什么是设计模式 设计模式是软件开发过程中面临的通用问题的解决方案。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 按使用目的分类 创建型–主要用于创建对象 单例模式-某个类只能有一个实例,提供一个全局的访问点工厂方法模式-创建…...
Android 原生进度条ProgressBar【自带】【水平风格】自定义
由于不想从零开始自定义,Android原生的进度条就已经很够用了呀! <ProgressBarandroid:id"id/pb_storage"style"style/Widget.AppCompat.ProgressBar.Horizontal"android:layout_width"match_parent"android:l…...

Nginx实现tcp代理并支持TLS加密实验
Nginx源码编译 关于nginx的搭建配置具体参考笔者之前的一篇文章:实时流媒体服务器搭建试验(nginxrtmp)_如何在线测试流媒体rtmp搭建成功了吗-CSDN博客中的前半部分;唯一变化的是编译参数(添加stream模块并添加其对应ss…...

vue3+setup 解决:this.$refs引用子组件报错 is not a function
一、如果在父组件中以下四步都没问题的话,再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 (如果是form页面请忽略这一步) <template> <a-modalv-model:visible"visible"title"头部名称&…...
189. 轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…...

com.alibaba:tools:jar com.alibaba:jconsole:jar
com.alibaba:tools:jar com.alibaba:jconsole:jar...

洛谷 P1020 [NOIP1999 普及组] 导弹拦截【一题掌握三种方法:动态规划+贪心+二分】最长上升子序列LIS解法详解
P1020 [NOIP1999 普及组] 导弹拦截 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码动态规划(NOIP要求:时间复杂度O(n^2^))贪心二分(O(nlgn)) 后话额外测试用例样例输入 #1…...
golang的管道阻塞问题
package mainimport ("fmt""sync"//"time" ) var wg sync.WaitGroup func writeData(intchan chan int){defer wg.Done()for i : 1; i < 9; i {intchan<-ifmt.Println("写入的数据为:",i)//time.Sleep(time.Seco…...

用HTML + javaScript快速完成excel表格信息除重并合并
今天突然接到一个工作,要把两个存储在.xls的主体信息表,除重后合并成一个主体信息表,并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多,如果信息表中的信息量不大的话,手工处理一下也行,如…...

高性能网络编程 - The C10M problem
文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里,因为IPv6协议下每个服务器的潜在连接数都是数以百万级的,单机服务器处理数百万的并发连接࿰…...

java计算机毕业设计SpringBoot在线答疑系统
项目介绍 本文从学生的功能要求出发,建立了在线答疑系统,系统中的功能模块主要是实现管理员权限;首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限:首页、个人中心、疑难解答管理、试卷管理、试题管理…...

Doc as Code (4):使用Git做版本管理,而不是使用目录做版本管理
▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在引入版本管理工具之前,文档工程师使用文件系统提供的功能来管理文件。大家是这样工作的: 文件按照分类放在不同的目录里,使用编辑器(如:MS Word)打开文档进…...
【Codeforces】 CF1870E Another MEX Problem
题目链接 CF方向 Luogu方向 题目解法 解法1 考虑优化 d p dp dp 转移次数,即只转移有用的区间 不难发现, m e x ( l , r ) m e x ( l 1 , r ) mex(l,r)mex(l1,r) mex(l,r)mex(l1,r) 或 m e x ( l , r ) m e x ( l , r − 1 ) mex(l,r)mex(l,r-1…...
【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数
怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数 需求分析: 1.统计性别为女性的所获学位下不同学历层次的人数 2.统计不同职务职称的不同学位和学历层次的人数代码 def cal_xuewei_number(self):# 读取表格文件table pd.read_excel("…...
浅谈Elasticsearch查询和搜索
Elasticsearch查询和搜索 Elasticsearch是一个分布式、实时的搜索和分析引擎,广泛应用于全文搜索、日志分析、实时数据分析等场景。Elasticsearch提供了丰富的查询和搜索功能,如查询DSL、过滤、排序、分页、高亮和聚合等。本文将详细介绍如何在Elastics…...

SLAM从入门到精通(被忽视的基础图像处理)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 工业上用激光slam的多,用视觉slam的少,这是大家都知道的常识。毕竟对于工业来说,健壮和稳定是我们必须要考虑的…...

【C++】继承详解
本篇要分享的内容是关于继承的内容哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊 以下为本篇目录 目录 1.简单了解继承 2.继承的简单定义 3.继承简单使用 4.继承方式 4.1基类的privat 4.2基类的protected 4.3不可见与private的区别 5.父子类对象赋值转换 6.继承的作用域 7.子…...
react:swr接口缓存
useSWR 是一个 React Hooks,是 HTTP 缓存库 SWR 的核心方法之一。SWR 是一个轻量级的 React Hooks 库,通过自动缓存数据来实现 React 的数据获取。 第一个参数是被缓存的数据的 key, 第二个参数是一个函数,该函数返回数据或者一个…...

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python
这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...