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

关于设计模式的记录

###############
先弄清楚类模型的关系
###############
万物的抽象关系
###############
1.组合 composition实菱形 实线 无填充箭头整体与部分的关系同生共死代码体现:成员变量如:生命体与器官,http请求(请求行,请求头,请求体),教室(黑板、桌椅等),班级(学生、老师等)
2.聚合 aggregation空菱形 实线 无填充箭头整体与部分关系可独立存货代码体现:成员变量比组合的关系弱如:手机与手机零件(比如摄像头)
3.关联 association实线 无填充箭头是一种个体与个体关系,也可以是一种拥有关系(弱关系),可以是单向也可以是双向,还可以是自关联代码体现:成员变量如:老师与学生,学生与课程,夫妻,单身汉
4.泛化 generalization实线 空心箭头是一种继承、抽象关系代码体现:继承如:动物分为很多种,手机可分为很多种
5.实现 realization虚线 空心箭头是一种抽象到具体的关系,类与接口的关系代码体现:impl如:人会说话、猫会叫
6.依赖 dependency虚线 无填充箭头是一种使用关系代码体现:局部变量,方法调用如:人需要呼吸那就依赖于空气,人需要喝水那就依赖于水###############六大设计原则###############
1.开闭原则对扩展开发 对修改关闭用抽象构建框架 用实现扩展细节
2.依赖倒置高层模块不应该依赖底层模块,他们应该依赖其抽象
3.单一职责不要存在多于一个导致类变更的原因,一个接口/类应当只负责一项职责
4.接口隔离不要用一个总接口,用多个接口进行功能隔离
5.迪米特法则最少知道原则,既一个对象应当对其他对象尽量少的知道,降低耦合
6.里氏替换一个引用了基类的地方都必须能透明化的替换成它的子类#######################################强弱关系
泛化=实现 > 组合 > 聚合 > 关联 > 依赖############结构模式##############
1.适配器模式将接口的功能转换成另一种接口表示,在不改变原接口的前提下,扩充了能力以及兼容性比如:一个上层业务已经存在一个接口,但是另一个业务需要改动,为了不改变原接口的功能,用适配器模式可以做到兼容。目的是为了改变接口功能
2.装饰器模式动态的将功能附加到对象上,它比继承更有弹性,同种类型的单方功能组合和扩充(增强)区分装饰者(附加)和被装饰者(原始),他们都有一个共同的超类目的是为了单方面的增强功能
3.代理模式有些服务不能直接访问,或者有安全控制,为了解决这个问题,使用代理模式。他解决的是控制问题,
4.外观模式隐藏系统的复杂度,向客户端提供一个可以访问的接口门面角色子系统角色客户角色从规约上讲,系统方法应当是功能单一的,而使用单一功能方法组合的时候是复杂的,那么久需要一个统一的入口来组合这个复杂的过程,这个接口(方法)就是外观模式的体现
5.桥接模式将抽象部分和它的实现分离,使他们能够独立变化,重点在于分离与独立变化类爆炸,如不同的实现都得创建类,那我们能不能将实现分离,手机样式有很多种,不能因为样式变化我们就要创建一个手机类,手机类是固定的,但是它锁含的样式是可以变化的,由原来的样式-手机的关系转变为手机-样式的关系 手机抽象 样式抽象 手机抽象包含样式的抽象 各自实现 手机实现加入样式的实现取代多层继承
6.组合模式部分整体模式,将对象组合成树形结构,使得用户对单个对象和组合对象具有一致性的访问性,并且可以适应通用类型的一并管理核心是层级,相同的父类举例:文件夹和文件继承同一个父类 他们有共同的访问方法
7.享元模式通过共享的方式高效的支持更多细粒度的对象当存在大量对象的时候,可能会内存溢出,我们把其中公共的部分抽取,如果有相同的业务请求,直接返回在内存中已有的对象,避免重复创建对象。说白了就是抽取对象的共性,由工厂创建成一个公共对象,并且将这些公共对象放入内存(全局map),当需要对象的时候根据唯一值到这个map中获取,注意一个问题,公共对象也需要释放(淘汰机制),否则会溢出。
#########################################关系、行为模式##############
1.父类与子类关系1.策略模式将一系列的算法封装,而这些封装算法可以随环境、业务随意替代切换,并且他们的变化不会给客户端带来影响,前提是他们实现的是相同的接口减少代码中的if。。。else。。。也许在选择某个实现的时候还是需要if else的 但是对于客户端而言是不需要去关注if else 这部分业务的2.模板方法模式(抽象类)定义一系列的算法骨架,也就是实现的流程但不具体的实现,将实现延迟到实现类中说白了就是先定义做一家事情的流程(抽象方法的顺序执行),但是不详细说明做的详情,抽象方法的实现由子类自己决定比如:父类定义做饭(洗菜 切菜 炒 装盘),做饭的流程是预先定义好的,但是洗菜,切菜等的具体方式是需要根据做什么饭才能决定的当做汤时,我们需要洗什么 切什么 有做汤的实现类决定西红柿炒鸡蛋 切什么 洗什么 这个是由西红柿炒鸡蛋这个实现类决定的。
2.两个类之间1.观察者模式定义的对象间存在一种一队多的关系,当一个对象的状态发生变化的时候,其他依赖它对象都要得到通知,并被自动更新一般适用于通知2.迭代子模式理解我们常用的Iteretor,一般由一个迭代器接口规定其操作(如:hasnext,next,remove等),然后由具体子类来实现。通常用于顺序访问聚合对象的内部的各个对象而不需要暴露其内部表示(这个聚合对象的内部结构)内部结构指:聚合对象的内部组成如:list、数组等结构,本来我们取聚合对象的时候是取其属性,然后按数据类型来获取这个属性包含的各个对象(迭代)迭代子模式可以不需要暴露这个聚合对象的内部结构(被next、hasnext等方法屏蔽)3.责任链以链式处理方式来处理一组或多组不同类型的数据1.多个对象协同处理数据,具体哪个对象能处理数据由由这些对象本身的业务划分(专属领域)来区分2.可动态的指定一组对象处理,或动态的添加处理对象(设置下一个处理对象)。3.在不明确处理者的时候,向多个处理者中的一个提交请求:就是不确定哪个对象能处理,被迫向链式处理结构提交数据,最终由能处理的哪个对象处理,这种情况不常见4.命令模式在一组操作中抽象出操作为命令(比如开、关、重启、注销等一组命令),由角色来区分职责(调用->接受->具体命令->执行者),他实现的是行为请求者与行为实现者的解耦,而这个解耦的关键是命令接受者命令接受者作为中介,接受命令的同时又可以调用具体命令执行抽象角色 命令调用者 命令管理者 命令抽象 具体命令 命令执行者命令管理者包含抽象命令(具体命令),管理者执行的时候不用管具体命令是啥,只管执行,具体命令包含命令执行者这样在命令发生变化的时候,调用者不需要作出改变,而只要命令执行者或者具体命令去更改有新增的命令只要扩充具体命令和执行者就行
3.类的状态1.备忘录模式又叫做快照模式,和日常中的存档类似,在不破坏对象封装性的前提下,捕获对象的内部状态,并在该对象之外保存状态,以便在以后能进行使用、恢复等常见的就是日志备份,undolog,回退等等发起人:提供创建备忘录和恢复数据的功能,实现其他业务,可以访问备忘录的实际内容备忘录:存储备忘录管理者:对备忘录进行管理,但不能访问备忘录的内容2.状态模式对象能够根据其状态自动的改变其行为,允许对象状态改变时改变它的行为如视频播放,播放、暂停、快进、快退等的状态切换 暂停不能快进state 抽象状态concretestate 实际状态context 环境角色 他包含了state
4.通过中间类1.访问者模式将作用于某种数据结构中的各个元素的操作分离出来封装成独立的对象,使得其在不改变数据结构的前提下可以添加作用于这些元素新的操作,为数据结构中的每个元素提供更多的访问方式元素和元素的操作分开抽象访问者 访问者抽象具体访问者 提供对元素的扩充访问方法抽象元素 结构中的元素具体元素 具体元素 针对性的方法对象结构 对象的聚合类型对象结构传入visitor,元素接受访问者,元素调用访问者方法,访问者方法扩充对当前元素的操作方法2.中介者模式定义一个对象用于协调封装一系列对象的操作,而这些对象之间没有耦合关系,这些耦合关系被中介者处理。这个模式是迪米特法则(最少知道)的典型应用比较好理解,就是中介把对象间要关联的操作和给做了3.解释器模式就是解释某些内容的含义,比如sql解释器,比较接近于底层,用的比较少context 上下文 存入被解释的对象 解释的规则 创建一个非终结符的解释器抽象解释器 解释器的抽象父类非终结符解释器 中间解释器 可以有一个或多个 他可包含终结符解释器 一种类型的解释一般只与一种非终结符解释器对应 但一种类型的非终结符解释器可以包含多个终结符解释器 这和组合模式有点类似终结符解释器 最终解释器 发生真正的解释 不包含有其他解释器 一般一种规则对应一种终结符解释器一般流程:创建上下文(填入共享数据和非终结符解释器 如:被解释对象,解释的规则等)->创建非终结符解释器(构建这类的数据解释所需要的的终结符解释)->调用非终结符解释器的解释方法->按规则调用终结符解释器的解释方法->终结符解释器按规则解释->返回结果

相关文章:

关于设计模式的记录

############### 先弄清楚类模型的关系 ############### 万物的抽象关系 ############### 1.组合 composition实菱形 实线 无填充箭头整体与部分的关系同生共死代码体现:成员变量如:生命体与器官,http请求(请求行,请求…...

Lambda-常见的函数式接口

如果需要使用Lambda接口&#xff0c;就必须要有一个函数式接口 函数式接口是有且仅有一个抽象方法的接口, 对应的注解是FunctionalInterface Java中内置的常见函数式接口如下: 1.Runnable/ Callable /*** The <code>Runnable</code> interface should be implem…...

P1196 [NOI2002] 银河英雄传说 带权并查集

[NOI2002] 银河英雄传说 题目背景 公元 580158015801 年&#xff0c;地球居民迁至金牛座 α\alphaα 第二行星&#xff0c;在那里发表银河联邦创立宣言&#xff0c;同年改元为宇宙历元年&#xff0c;并开始向银河系深处拓展。 宇宙历 799799799 年&#xff0c;银河系的两大军…...

【项目实战】快来入门Groovy的基础语法吧

一、Groovy是什么? 1.1 与Java语言的关系 下一代的Java 语言,增强Java平台的唯一的脚本语言跟java一样,它也运行在 JVM 中。支持Java平台,无缝的集成了Java 的类和库;Groovy是一种运行在JVM上的动态语言,跑在JVM中的另一种语言编译后的.groovy也是以class的形式出现的。1…...

Mybatis中的动态SQL

Mybatis中的动态SQL 当存在多条件查询的SQL时&#xff0c;当用户某个条件的属性没有写时&#xff0c;就会存在问题&#xff0c;在test中则不能很好的运行 所以Mybatis提出了动态SQL。 即判断用户是否输入了某个属性 动态SQL中的一些问题 方法一 这个里的and是为了确保if条…...

VUE常用API

1.$set数据变了&#xff0c;视图没变 this.$set(targe&#xff0c;key&#xff0c;value)2.$nextTick:返回参数[函数]。是一个异步的&#xff0c;功能获得更新后DOM$nextTick(callback){return Promise.resolve().then(()>{callback();}) }3.$refs获取dom4.$el获取当前组件根…...

25 openEuler管理网络-使用nmcli命令配置ip

文章目录25 openEuler管理网络-使用nmcli命令配置ip25.1 nmcli介绍25.2 设备管理25.2.1 连接到设备25.2.2 断开设备连接25.3 设置网络连接25.3.1 配置动态IP连接25.3.1.1 配置IP25.3.1.2 激活连接并检查状态25.3.2 配置静态IP连接25.3.2.1 配置IP25.3.2.2 激活连接并检查状态25…...

如何安装和使用A-ops工具?

一、pip配置 1.配置信任域 ​ pip3 config set global.trusted-host mirrors.tools.huawei.com2.配置pip源的url地址pip3 config set global.index-url http://mirrors.tools.huawei.com/pypi/simple 二、npm安装及配置 npm -v检测系统有无安装npm,如果没有的话需要配置ope…...

MySql数据库环境部署

MySql基础与Sql数据库概述基础环境的建立MYSQL数据库的连接方法MySql的默认数据库数据库端口号数据库概述 数据库&#xff08;DataBase&#xff0c;DB)∶存储在磁带、磁盘、光盘或其他外存介质上、按定结构组织在一起的相关数据的集合。数据库管理系统〈DataBase Management S…...

极品笔记,阿里P7爆款《K8s+Jenkins》技术笔记,职场必备

前些日子从阿里的朋友那里取得这两份K8sJenkins的爆款技术笔记&#xff1a;《K8S(kubernetes)学习指南》《Jenkins持续集成从入门到精通》&#xff0c;非常高质量的干货&#xff0c;我立马收藏&#xff01; 而今天咱们文章的主角就是这非常之干货的技术笔记&#xff1a;K8SJenk…...

数据结构:各种排序方法的综合比较

排序方法的选用应视具体场合而定。一般情况下考虑的原则有:(1)待排序的记录个数 n;(2)记录本身的大小;(3)关键字的分布情况:(4)对排序稳定性的要求等。 1.时间性能 (1) 按平均的时间性能来分,有三类排序方法: 时间复杂度为 O(nlogn)的方法有:快速排序、堆排序和归并排序,其中…...

【设计模式】 策略模式介绍及C代码实现

【设计模式】 策略模式介绍及C代码实现 背景 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xff0c;如果将这些算法都编码到对象中&#xff0c;将会使对象变得异常复杂&#xff0c;而且有时候支持不使用的算法也是一个性能负担。 如何…...

【数据库】第二章 关系数据库

第二章 关系数据库 2.1关系数据结构及形式化定义 关系 域&#xff08;domain) :域是一组具有相同数据类型的值的集合&#xff0c;可以取值的个数叫基数 笛卡尔积 &#xff1a;一个记录叫做一个元组&#xff08;tuple),元组中每一个属性值&#xff0c;叫一个分量 基数&…...

oracle和mysql的分页

oracle的分页&#xff1a;rownum 注意:&#xff1a; 对 ROWNUM 只能使用 < 或 <, 用 、 >、 > 都不能返回任何数据。 rownum是对结果集的编序排列&#xff0c;始终是从1开始&#xff0c;所以rownum直接使用时不允许使用>、> 所以当查询中间部分的信息时&…...

深拷贝与浅拷贝的理解

浅拷贝的理解浅拷贝的话只会拷贝基本数据类型&#xff0c;例如像string、Number等这些&#xff0c;类似&#xff1a;Object、Array 这类的话拷贝的就是对象的一个指针(通俗来讲就是拷贝一个引用地址&#xff0c;指向的是一个内存同一份数据)&#xff0c;也就是说当拷贝的对象数…...

Shell变量

一、变量分类 根据作用域分三种 &#xff08;一&#xff09;只在函数内有效&#xff0c;叫局部变量 &#xff08;二&#xff09;只在当前shell进程中有效&#xff0c;叫做全局变量 &#xff08;三&#xff09;在当前shell进程与子进程中都有效&#xff0c;叫做环境变量 shell进…...

Android 8请求权限时弹窗BUG

弹窗BUG 应用使用requestPermissions申请权限时&#xff0c;系统会弹出一个选择窗口&#xff0c;可进行允许或拒绝&#xff0c; 此窗口中有一个”不再询问“的选择框&#xff0c; ”拒绝”及“允许”的按钮。 遇到一个Bug,单点击“不再询问”&#xff0c;“允许”这个按钮会变…...

路漫漫:网络空间的监管趋势

网络空间是“以相互依存的网络基础设施为基本架构&#xff0c;以代码、信息与数据的流动为环境&#xff0c;人类利用信息通讯技术与应用开展活动&#xff0c;并与其他空间高度融合与互动的空间”。随着信息化技术的发展&#xff0c;网络空间日益演绎成为与现实人类生存空间并存…...

洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk

最后水一篇水题题解&#xff08;实在太水了&#xff09; # [USACO1.3]混合牛奶 Mixing Milk ## 题目描述 由于乳制品产业利润很低&#xff0c;所以降低原材料&#xff08;牛奶&#xff09;价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。 Marry 乳业从一些奶农手…...

数据库的基本查询

注意&#xff1a;LIMIT的两个参数&#xff0c;第一个是起始位置&#xff0c;第二个是一次查询到多少页。注意&#xff1a;什么类型的数字都是可以排序的。日期的降序是从现在到以前&#xff0c;MySQL ENUM值如何排序&#xff1f;在MYSQL中&#xff0c;我们知道每个ENUM值都与一…...

10 分钟把你的 Web 应用转为桌面端应用

在桌面端应用上&#xff0c;Electron 也早已做大做强&#xff0c;GitHub桌面端、VSCode、Figma、Notion、飞书、剪映、得物都基于此。但最近后起之秀的 Tauri 也引人注目&#xff0c;它解决了 Electron 一个大的痛点——打包产物特别大。 我们知道 Electron 基于谷歌内核 Chro…...

Delphi RSA加解密(二)

dll开发环境: Delphi XE 10.1 Berlin exe开发环境: Delphi 6 前提文章: Delphi RSA加解密(一) 目录 1. 概述 2. 准备工作 2.1 下载DEMO程序 2.2 字符编码说明 3. Cryption.dll封装 3.1 接口概况 3.2 uPub.pas单元代码 3.3 uInterface.pas单元代码 3.4 特别注意 4. 主程序…...

pytorch 深度学习早停设置

当你设置早停的时候你需要注意的是你可能得在几个epoch后才开始判断早停。 早停参数设置 早停&#xff08;Early Stopping&#xff09;是一种常用的防止深度学习模型过拟合的方法。早停的设置需要根据具体情况进行调整&#xff0c;常见的做法是在模型训练过程中使用验证集&am…...

【Vue学习】Vue高级特性

1. 自定义v-model Vue中的自定义v-model指的是在自定义组件中使用v-model语法糖来实现双向绑定。在Vue中&#xff0c;通过v-model指令可以将表单元素的值与组件实例的数据进行双向绑定。但是对于自定义组件&#xff0c;如果要实现v-model的双向绑定&#xff0c;就需要自定义v-…...

Android 12.0 系统Settings去掉开发者模式功能

1.概述 在12.0的系统rom产品定制化开发中,在系统Settings中的关于手机的选项中,系统默认点击版本号5次会自动打开开发者模式,但是在某些产品开发过程中,禁止打开开发者模式,需要去掉开发者模式的功能,所以需要在系统Settings中查看开发者模式的相关流程代码,然后禁用掉开…...

buu [NCTF2019]babyRSA 1

题目描述&#xff1a; 题目分析&#xff1a; 首先明确两个公式&#xff1a; e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题&#xff0c;我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算&#xff0c;我们知道其长度为2066位&#xff0c;而生成p的…...

Java:如何选择一个Java API框架

Java编程语言是一种高级的、面向对象的语言&#xff0c;它使开发人员能够创建健壮的、可重用的代码。Java以其可移植性和平台独立性而闻名&#xff0c;这意味着Java代码可以在任何支持Java运行时环境(JRE)的系统上运行。Java和Node js一样&#xff0c;是一种功能强大的通用编程…...

mt6735 MIC 音量的调整及原理介绍

[DESCRIPTION] MIC 音量的调整及原理介绍[SOLUTION] audio_ver1_volume_custom_default.h#define VER1_AUD_VOLUME_MIC \ 64,112,192,144,192,192,184,184,184,184,184,0,0,0,0,\ 255,192,192,180,192,192,196,184,184,184,184,0,0,0,0,\ 255,208,208,180,255,208,196,0,0,0,0,…...

【深度学习】什么是线性回归逻辑回归单层神经元的缺陷

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录逻辑回归&线性回归单层神经元的缺陷单层神经元的缺陷逻辑回归&线性回归 线性回归预测的是一个连续值&#xff0c; 逻辑回归给出的”是”和“否”的回答. 等…...

Spring拦截器

SpringMVC提供了拦截器机制&#xff0c;允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。preHandle()&#xff1a;这个方法在业务处理器处理请求之前被调用&#xff0c;在该方法中对用户请求…...