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

设计模式-笔记

文章目录

      • 七大原则
      • 单例模式
      • 桥模式 bridge
      • 观察者模式 observer
      • 责任链模式 Chain of Responsibility
      • 命令模式 Command
      • 迭代器模式 Iterator
      • 中介者模式 Mediator
      • 享元模式 Flyweight Pattern
      • 组合模式 composite
      • 装饰模式 Decorator
      • 外观模式 Facade
          • 简单工厂模式
          • 工厂方法模式
          • 工厂抽象模式

七大原则

开闭原则 (Open Close Principle)

  • 对扩展开放,对更改关闭
  • 保证以前代码的准确性,使开发者更专注于新扩展的代码上

单一职责原则 (Single Responsibility Principle)

  • 一个类只负责一个功能领域的职责
  • 降低类的复杂度,当修改一个功能时,降低对其他功能的影响,提供类的可读性

里氏替换原则 (Liskov Substitution Principle)

  • 任何基类出现的地方,子类一定可以出现
  • 在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象,开闭原则实现的手段之一

依赖倒转原则 (Dependence Inversion Principle)

  • 针对接口编程,抽象不依赖于细节,细节应依赖于抽象
    - 多数情况下,开闭原则,里氏替换原则,依赖倒转原则会同时出现,开闭原则是目标,里氏替换原则是基础,依赖倒转是手段。

接口隔离原则 (Interface Segregation Principle)

  • 使用多个专门的接口,不使用单一的总接口
    - 当一个接口太大时,我们需要把他拆分成更小的接口,但不能违反单一职责原则,每个接口应该承担一种相对独立的角色,不该干的事情不干,该干的事情都要干。

迪米特法则 (Law Of Demeter)

  • 一个实体应当尽量少的与其他实体发生相互作用,也就最少知道原则,一个对象尽量让其它对象保持最少的了解
    - 应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的 某一个方法的话,可以通过第三者转发这个调用。

合成复用原则(Composite Reuse Principle)

  • 尽量使用组合而非继承
    - 就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过这些对象的委派达到复用已有功能的目的

单例模式

只涉及一个负责实例化自身的类,以确保它创建的实例不会超过一个,并且提供一个全局访问控制点

  1. 每个类在内存中只有一个实例
  2. 实例必须由该类创建
  3. 一个实例必须被整个系统访问

桥模式 bridge

从现实中分离抽象,这样两者可以独立变化
在这里插入图片描述Abstraction:抽象定义了抽象接口
RefinedAbstraction:使用对Implementor类型的对象的引用来实现Abstraction接口
Implementor:定义实现类的接口,这个接口不需要直接对应Abstraction接口,可以有很大不同

例:现在我们需要供应三种尺寸的蜡笔(大、中、小),有五种颜色(红、绿、蓝、白、黑)。根据桥状图案,设计一个系统来制作彩色蜡笔。
在这里插入图片描述
在这里插入图片描述

观察者模式 observer

定义对象间的一种一对多的依赖关系,以便当一个对象的状态改变时,所有依赖它的对象都得到通知并自动刷新
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

责任链模式 Chain of Responsibility

在编写代码过程中,经常会发生由一个对象生成的事件需要另一个对象处理的情况,有时候还会被拒绝访问需要处理的对象
责任链设计模式允许对象发送命令,但不知道哪个对象将接收和处理它。请求从一个对象发送到另一个对象,使他们成为链的一部分,这个链中的每个对象都可以处理/传递命令。
为解除请求的发送者和接受者之间的解耦,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它

学生需要申请奖学金,并提交申请表,该申请表需要一层层批准:辅导员,系主任,院长…

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

命令模式 Command

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队货记录请求日志,以及支持可取消的操作

  • 将请求封装在对象中
  • 允许参数化具有不同请求的客户端
  • 允许将请求保存在队列中
  • 命令在发送方和接收方之间解耦
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

迭代器模式 Iterator

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象内部表示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

中介者模式 Mediator

用一个中介对象来封装一系列对象的交互;中介对象使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
在这里插入图片描述
在这里插入图片描述

享元模式 Flyweight Pattern

运用共享技术有效地支持大量细粒度的对象。

适用性
当以下所有的条件都满足时,可以考虑使用享元模式:

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

满足以上的这些条件的系统可以使用享元对象。

最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。
在这里插入图片描述

组合模式 composite

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象使用具有一致性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

装饰模式 Decorator

动态地给一个对象添加一些额外的功能

  • 动态、透明的方式给单个对象添加职责。
  • 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式。
  • 避免子类数目爆炸性增长

在这里插入图片描述
在这里插入图片描述

Component: 定义一个对象接口,可以给这些对象动态地添加职责.
ConcreteComponent: 定义一个对象,可以给这个对象添加职责.
Decorator: 持有一个指向Component对象的引用,并定义一个与Component的接口一致的接口.
ConcreteComponent: 向组件添加职责

在这里插入图片描述
在这里插入图片描述

外观模式 Facade

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

简单工厂模式

用户不需要知道产品类别,只需要提供一个参数
让客户类永远接触不到产品类,只是让用户知道抽象或接口类
在这里插入图片描述
在这里插入图片描述

工厂方法模式

简单工厂模式的问题就是:类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改
工厂方法模式添加了concrete factory和abstract factory——遵循open-close原则和dependency reverse 原则
工厂是一个抽象creator,只是要求具体的工厂生产一个产品

如下例:
假如增加其他品牌鼠标,工厂类需要修改,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
在这里插入图片描述

工厂抽象模式

抽象工厂提供了创建一系列相关对象的接口,而无需显式地指定它们的类
factory method 处理来自多个生产商的一组产品
factory abstract 处理来自多个生产商的多组产品
抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件
例:新增一个键盘产品类
在这里插入图片描述在这里插入图片描述

相关文章:

设计模式-笔记

文章目录七大原则单例模式桥模式 bridge观察者模式 observer责任链模式 Chain of Responsibility命令模式 Command迭代器模式 Iterator中介者模式 Mediator享元模式 Flyweight Pattern组合模式 composite装饰模式 Decorator外观模式 Facade简单工厂模式工厂方法模式工厂抽象模式…...

【全志T113-S3_100ask】12-3 Linux蓝牙通信实战(基于BlueZ的C语言BLE蓝牙编程)

【全志T113-S3_100ask】12-3 Linux蓝牙通信实战(基于BlueZ的C语言BLE蓝牙编程 背景(一)获取BlueZ源码(二)首次编译2-1 编写Makefile2-2 make编译2-3 首次测试2-3-1 开发板操作2-3-2 安卓端操作(三)源码分析3-1 程序入口3-2 蓝牙设备名称3-3 GATT服务(四)实战4-1 添加B…...

Java学习之路003——集合

1、 代码演示 【1】新增一个类,用来测试集合。先创建一组数组,数组可以存放不同的数据类型。对于Object类型的数组元素,可以通过.getClass方法获取到具体类型。 【2】如果数组指定类型为int的时候,使用.getClass()就会提示错误。 …...

生成和查看dump文件

在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢? 1. 什么是dump文…...

K8S集群1.24使用docker作为容器运行时出现就绪探针间歇性异常

文章目录1. 环境介绍2. 异常信息3. 分析问题3.1 kubernetes 健康检查3.1.1 存活探针3.1.2 就绪探针3.1.3 启动探针3.2 检测方法4. 解决办法1. 环境介绍 组件版本kubernetes1.24.2docker18.03.1-cecri-docker0.2.6 2. 异常信息 最近监测到 kubernetes 集群上 calico-node Pod 运…...

士大夫身份第三方水电费第三方

package com.snmocha.snbpm.job;import org.springframework.stereotype.Component;import com.xxl.job.core.handler.annotation.XxlJob;import lombok.extern.slf4j.Slf4j;/*** Demo定时任务.* Author:zhoudd* Date:2023-01-15*/ Component Slf4j publ…...

RDO一体化部署OpenStack

RDO一体化部署OpenStack 环境准备 安装centos7 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J785hZvT-1677578418769)(C:\Users\HONOR\AppData\Roaming\Typora\typora-user-images\image-20230228171254675.png)] 使用vmware安装安装centos7&a…...

CC2530+ESP8266使用MQTT协议上传阿里云的问题

ATMQTTPUB<LinkID>,<"topic">,<"data">,<qos>,<retain>LinkID: 当前只支持 0 topic: 发布主题, 最长 64 字节 data: 发布消息, data 不能包含 \0, 请确保整条 ATMQTTPUB 不超过 AT 指令的最大长度限制 qos: 发布服务质量, 参…...

Java基础:爬虫

1.本地爬虫 Pattern:表示正则表达式 Matcher:文本匹配器&#xff0c;作用按照正则表达式的规则去读取字符串&#xff0c;从头开始读取。在大串中去找符合匹配规则的子串。 1.2.获取Pattern对象 通过Pattern p Pattern.compile("正则表达式");获得 1.3.获取Matc…...

纯手动搭建大数据集群架构_记录008_搭建Hbase集群_配置集群高可用---大数据之Hadoop3.x工作笔记0169

首先准备安装包 然后将安装包分发到集群的其他机器上去 然后因为运行hbase需要zookeeper支持,所以这里首先要去,启动zk 走到/opt/module/hadoop-3.1.3/bin/zk.sh 然后 zk.sh start 启动一下,可以看到启动了已经 然后zk.sh status 可以看zookeeper的状态 然后我们再去启动一下…...

Linux系统认知——驱动认知

文章目录一、驱动相关概念1.什么是驱动2.被驱动设备分类3.设备文件的主设备号和次设备号4.设备驱动整体调用过程二、基于框架编写驱动代码1.驱动代码框架2.驱动代码的编译和测试三、树莓派I/O口驱动的编写1.微机的总线地址、物理地址、虚拟地址介绍2.通过树莓派芯片手册确定需要…...

Spring boot装载模板代码并自动运行

Spring boot装载模板代码涉及的子模块及准备省心Clickhouse批量写JSON多层级数据自动映射值模板代码生成及移交控制权给Spring IOC涉及的子模块及准备 最近比较有空&#xff0c;之前一直好奇&#xff0c;提交到线上考试的代码是如何执行测试的&#xff0c;在实现了基础的demo后…...

全国领先——液力悬浮仿生型人工心脏上市后在同济医院成功植入

2023年2月22日&#xff0c;华中科技大学同济医学院附属同济医院&#xff08;同济医院&#xff09;心脏大血管外科团队举办了一场气氛热烈的小规模庆祝活动&#xff0c;魏翔主任、程才副主任、王星宇副主任医师和李师亮医师到场&#xff0c;为终末期心衰患者黄先生“庆生”&…...

基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

云原生周刊:开源漏洞仍然是开发人员面临的挑战 | 2023.2.27

Synopsys 发布了最新一期的开源安全年度报告&#xff0c;开源安全和风险分析 (OSSRA)。这份报告由Synopsys 网络安全研究中心 (CyRC)创建&#xff0c;着眼于 Black Duck 审计服务团队进行的 1,700 多次商业代码库审计的结果。 自 2019 年以来&#xff0c;OSSRA 所有 17 家企业…...

Docker学习总结

1、镜像操作 1.1 拉取、查看镜像 步骤一&#xff1a; 首先去镜像仓库搜索nginx镜像&#xff0c;比如[DockerHub]( Docker Hub Container Image Library | App Containerization ) : 步骤二&#xff1a; 根据查看到的镜像名称&#xff0c;拉取自己需要的镜像 通过命令&…...

Android 9.0系统源码_通知服务(三)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知&#xff0c;对于移动设备来说是很常见的一种功能需求&#xff0c;本篇文章我们将会结合Android9.0系统源码具体来分析一下&#xff0c;应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…...

python中的序列——笔记

一、介绍 ABC语言时一个致力于为初学者设计编程环境的长达十年的研究项目。 Python也从ABC那里继承了用统一的风格去处理序列数据这一特点。不管是哪种数据结构&#xff0c;字符串、列表、字节序列、数组、XML元素&#xff0c;抑或是数据库查询结果&#xff0c;它们都共用一套…...

taobao.user.seller.get( 查询卖家用户信息 )

&#xffe5;开放平台基础API必须用户授权 查询卖家用户信息&#xff08;只能查询有店铺的用户&#xff09; 只能卖家类应用调用。 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 点击获取key和secret请求示例…...

WebRTC Qos策略

1.WebRTC 用于提升 QoS 的方法&#xff1a;NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR&#xff08;动态帧率调整策略&#xff09;https://blog.csdn.net/CrystalShaw/article/details/80432267丢包重传NACK&#xff1a;一种通知技术&#xff0c;…...

Mysql数据查询

文章目录1 group by子句2 回溯统计3 having子句1 group by子句 group by子句**&#xff1a;分组统计&#xff0c;根据某个字段将所有的结果分类&#xff0c;并进行数据统计分析 分组的目的不是为了显示数据&#xff0c;一定是为了统计数据group by子句一定是出现在where子句之…...

Kafka入门(五)

下面聊聊Kafka常用命令 1、Topic管理命令 以topic&#xff1a;test_1为例 1.1、创建topic ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test_1参数说明&#xff1a; –bootstrap-server&#xff1a;…...

如何快速在windows系统中切换node.js版本

前言 最近在同时维护公司的两个项目&#xff0c;一个是新项目&#xff0c;另一个是老项目&#xff0c;二者所依赖的node版本是不一致的。 这就导致我在切换项目的时候必须重新安装对应版本的 node.js&#xff0c;否则就会报各种神马错误。 但这一卸一装可着实烦死个银&#xf…...

设计模式-单例模式(java)

单例是一种常用的设计模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。在Java编程语言中&#xff0c;实现单例有多种方法&#xff0c;本篇文章将介绍其中的两种实现方式。 方式一&#xff1a;饿汉式单例模式 饿汉式单例模式是最简单的实…...

Revit中复合墙图层的规则和CAD识别翻模墙

一、Revit中用于指定复合墙图层的规则&#xff0c;具体内容? 在编辑复合墙的结构时&#xff0c;请使用“指定图层”工具将“编辑部件”对话框中的行指定给图层或预览窗格中的区域&#xff0c;并遵循这些原则。 在预览窗格中&#xff0c;样本墙的各个行必须保持从左到右的顺序显…...

【DL】Paddle BML Codelab环境使用说明 - 知识点目录

《Paddle BML Codelab环境使用说明》 1. 编辑区 Code Cell 1.1 Code Cell 操作 Magic关键字/魔术命令 Magic命令含义%timeit测试单行语句的执行时间%%timeit测试代码块的执行时间%matplotlib inline显示matplotlib生成的图形%run调用外部python脚本%pdb 调试程序%pwd 查看当…...

python正则表达式处理文本-re模块

python正则表达式处理文本-re模块 1.概述 正则表达式通常用于含有大量文本处理的应用当中。例如&#xff0c;它们经常用作开发者使用的文本编辑程序的搜索模式&#xff0c;包括 vi&#xff0c;emacs 和现代集成开发环境。它们也是 Unix 命令行工具的组成部分&#xff0c;例如…...

换了固态硬盘需要重装系统吗?教你如何实现不重装系统!

电脑大家都用过嘛&#xff0c;如果您的计算机装的还是机械硬盘&#xff0c;想必阁下肯定是修身养性的高手&#xff0c;因为在这个浮躁的社会中&#xff0c;是很少有人能够忍受5分钟甚至更久的开机时间的&#xff0c;不仅开机慢&#xff0c;应用程序的响应速度也很慢&#xff0c…...

网上医疗预约挂号系统

技术&#xff1a;Java、JSP等摘要&#xff1a;网上医疗预约挂号系统是主要是对居民的保健、护理、疾病预防等健康信息实行有效的预约挂号管理。医疗机构为居民建立完整的健康档案&#xff0c;安排体检以及实施免疫等预防措施。而基于Web的远程保健平台以网上医疗预约挂号系统为…...

专题:一看就会的C++类模板讲解 (1)

目录 一.类模板的作用 二.类模板的定义&#xff1a; 三.类模板的声明格式&#xff1a; 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中&#xff0c;我们可能会面临这样的问题&#xff1a;要实现比较两个数的大小。明明比较两个数的方法都一样…...

高端开发网站系统/免费下载百度app最新版本

1. 把你的代码全部放在闭包里面 这是我用的最多的一条。但是有时候在闭包外面的方法会不能调用。不过你的插件的代码只为你自己的插件服务&#xff0c;所以不存在这个问题&#xff0c;你可以把所有的代码都放在闭包里面。而方法可能应该放在Prototype方法内部&#xff0c;我们后…...

网站怎么做商家定位/外贸网站搭建推广

把json字符串&#xff0c;变成json对象。很简单的就可以获取它的key 首先需要引入jar包 json-lib-2.4-jdk15.jar json包依赖以下几个包。 ezmorph-1.0.3.jar commons-logging.jar commons-lang-2.5.jar commons-collections-3.1.jar commons-beanutils-1.7.0.jar 剩…...

房地产网站建设公司推荐/天津百度快照优化公司

JavaScrip知识点总结一、JavaScript介绍二、JavaScript 和 html 代码的结合方式2.1 第一种方式2.2 第二种方式三、变量四、运算符4.1 关系&#xff08;比较&#xff09;运算符4.2 逻辑运算符五、数组六、函数6.1 函数的二种定义方式6.1.1 方式一6.1.2 方式二6.2 函数的 argumen…...

网站开发是怎么开发的/公司运营策划方案

LiveQing云平台 LiveQing云平台是一套由LiveQing、LiveGBS或LiveNVR构成的完整云平台架构&#xff0c;支持分布式、跨平台、多点部署&#xff0c;流媒体服务器支持负载均衡&#xff0c;按需直播&#xff0c;非常适用于互联网化的安防、智能家居、幼教平台、透明厨房、透明家装等…...

深圳网站开发奇辰科技/世界杯数据分析

一、安装 在集群中每台服务器都执行如下命令&#xff1a; yum install rsync -y 二、使用 rsync -P --rshssh root192.168.102.100:/mnt/test.sql.tar.gz /mnt/test/test.sql.tar.gz 这个命令的含义&#xff1a; -P 断点续传 -rsh ssh 远程shell /mnt/test/test.sql.tar.gz…...

开发工具怎么用/吉林seo排名公司

菜鸟到大神的上位历程&#xff0c;即学即用走向人生巅峰&#xff08;参考资料&#xff09; http://www.html5cn.org/article-9447-1.html w3school http://www.w3school.com.cn/html5/index.asp jQuery官网地址 http://jquery.com/ jQuery教程 http://www.runoob.com/jquery/jq…...