设计模式 - 概览
一、概念
分为三大类、23中具体设计模式。
类型 | 原理 | 具体模式 |
创建型 | 封装了具体类的信息,隐藏了类的实例化过程。 | 单例模式(Singleton) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 建造者模式(Builder) 原始模式(Prototype) |
结构型 | 类结构:采用继承机制来组合接口实现。 对象结构:组合对象来实现新功能。 | 适配器模式(Adapter) 代理模式(Proxy) 门面模式(Facade) 桥梁模式(Bridge) 装饰模式(Decorator) 合成模式(Composite) 享元模式(Flyweight) |
行为型 | 类行为:使用继承关系在几个类之间分配行为。 对象行为:使用对象聚合的方式来分配行为。 | 观察者模式(Observer) 策略模式(Strategy) 模板方法模式(Template Method) 命令模式(Command) 迭代器模式(Iterator) 调停者模式(Mediator) 状态模式(State) 责任链模式(Chan Of Responsibility) 访问者模式(Visitor) 备忘录模式(Memento) 解释器模式(Interpreter) |
二、创建型
模式 | 说明 | 解决的问题 | 原理 | 备注 |
单例模式 | ●实现一个类只有一个实例 ●提供一个全局访问点 | 保证一个类只有一个对象,降低对象之间的耦合度。 | ①私有化构造方法。 ②创建私有变量在内部实例化。 ③定义公共方法供外部获取唯一实例。 | 懒汉式、饿汉式、枚举、静态内部类 |
简单工厂模式 | 将“类实例化的操作”和“使用对象的操作”分开。 | 使用这可以直接实例化多个类对象而不需要知道其创建细节。 | 创建工厂类提供静态方法,根据传入不同参数而返回不同产品类的实例。 | - |
工厂方法模式 | 优化简单工厂模式中的问题:工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放-关闭”原则。 | 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化哪一个产品类。 | 在添加新的产品时就不用修改工厂逻辑而是添加新的工厂子类。 | |
抽象工厂模式 | 优化工厂方法模式中的问题:一个具体工厂只能创建一种产品,实际生活中一个工厂往往需要生产多种产品。 | 使用接口来创建一组相关产品,而不需要关心实际生产出的产品具体是什么,以此达到解耦。 | - | |
建造者模式 | 隐藏创建对象的过程和细节,在不知道这些的情况下就可以直接创建复杂的对象。 | ●降低创建单个复杂对象的难度 ●隔离复杂对象的创建和使用 | 封装了创建复杂对象的过程,只需要指定类型和内容。 | ●建造者以简化创建单个复杂对象为目的 ●工厂以简化创建多个对象为目的。 |
三、结构型
模式 | 说明 | 解决的问题 | 原理 | 备注 |
适配器模式 | 定义一个包装类用于包装不兼容接口的对象。 | 把一个类的接口变换成客户端锁期待的另一种接口,从而是原本不匹配而无法一起工作的两个类能够在一起工作。 | 把要适配类的API转为目标类的API,类适配器模式使用继承关系,对象适配器模式使用委托关系。 | ●灵活使用时:选择对象适配器模式 ●需要同时适配源类和其子类:选择对象适配器 ●需要重新定义Adapter的部分行为:选择类适配器 ●仅仅希望食用方便时:选择类适配器模式 |
门面模式 | 定义一个更高层的统一接口,外部通过这个接口对子系统中的一群接口进行访问。 | ●避免了系统和系统之间的高耦合度 ●使得复杂的子系统用法变得简单,提高了客户端的使用便捷性,无需关心子系统工作细节,通过门面角色即可调用相关功能。 | 创建一个统一的门面类,用来包装子系统中一个或多个复杂的类,客户端通过该门面类的方法来调用子系统中所有的方法。 | ●适配器模式:将一个对象包装起来以改变其接口,为的是转换接口。 ●门面模式:将一群对象“包装”起来以简化其接口,为的是简化接口的使用。 |
代理模式(静态&动态) | 为目标对象设置一个代理对象,由代理对象调用目标对象的方法,通过访问代理对象达到间接访问目标对象的效果。 | 防止直接访问目标对象带来的复杂性和安全问题。 | 外接访问代理对象,代理对象内部创建并调用目标对象。 | ●远程代理:为一个对象在不同地址空间提供局部代表。 ●虚拟代理:通过一个开销小的对象代理一个开销大的对象。 ●保护代理:控制目标对象的访问保护目标对象。 |
使用时才创建动态代理类和实例。通过反射动态调用目标对象的方法。 | 解决静态代理在目标对象较多的情况下,一个静态对象只能代理一种目标目标对象而出现静态代理对象量多、代码量大,从而导致代码变复杂的问题。 | ●设计动态代理(DynamicProxy)时不需要显示实现与目标对象(RealSubject)相同的接口,而是将这种实现推迟到程序运行时由JVM来实现。 ●通过Java反射机制的method.invoke(),通过调用动态代理类对象方法,从而自动调用目标对象的方法。 | ●静态代理场景下需要代理对象数量较多的情况下使用动态代理。 ●AOP领域面向切面变成。 |
四、行为型
模式 | 说明 | 解决的问题 | 原理 | 备注 |
策略模式 | 定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中。 | 解耦算法本身和其责任,使得客户端方便根据外部条件选择不同策略来解决问题,算法可独立于使用者而变化。 | ●定义抽象策略类角色(Strategy) ●定义具体策略角色(Concrete Strategy) ●定义环境角色(Context)用于连接上下文,即根据参数设置不同策略。 | 用于动态选择多重复杂算法的场景。 |
观察者模式 (发布订阅模式) | 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将收到通知并做出响应。 | 解耦常变对象与不常变对象之间的依赖关系(如常变的UI和不常变的业务逻辑)。 | ●观察者只需要实现 Observer 接口把自己注册到 Subject 中,就能收到事件消息。 ●被观察者(Observable)通过订阅(Subscribe)按顺序发送时间给观察者,观察者按顺序接收时间并做出响应。 | ●推模型:不管观察者是否需要都推送主题的详细信息。 ●拉模型:若观察者需要更具体的信息,由观察者主动到主题主题对象中获取。 |
模板方法模式 | 定义一个模板结构,将具体内容延迟到子类去实现。 | 实现了反向控制,通过父类调用其子类的操作,通过对子类的具体实现扩展不同的行为。 | 将相同部分的代码放在抽象的父类中,将不相同的代码放入不同的子类中。 | 一次性实现一个算法的不变部分,将可变的行为留给子类来实现。 |
相关文章:
设计模式 - 概览
一、概念 分为三大类、23中具体设计模式。 类型原理具体模式创建型封装了具体类的信息,隐藏了类的实例化过程。 单例模式(Singleton) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory…...
【Linux】Makefile
一、gcc 的缺点 gcc -o test a.c b.c我们具体分析:gcc -o test a.c b.c这条命令 它们要经过下面几个步骤: 1)对于a.c:执行:预处理 编译 汇编 的过程,a.c >xxx.s >xxx.o 文件。2)对于b.c…...
TS的函数如何定义类型
如何接受arguments参数 function add(...args: string[]) {let list4: IArguments arguments;}add(1, 2) 自定义一个args interface A1 {callee: Function,length: number,[index: number]: any}function adds(...args: string[]) {let list4: A1 arguments;}adds(1, 2) …...

xstream实现xml和java bean 互相转换
目录 pom引用java bean 类XML 转换工具类测试类执行结果注意问题 JAXB方式见: JAXB实现XML和Bean相互转换 Java中实现XML和Bean的转换的方式或插件有以下几种: JAXB(Java Architecture for XML Binding):JAXB是Java …...

斯坦福机器学习 Lecture1 (机器学习,监督学习、回归问题、分类问题定义)
https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义:不需要明确编程就能让计算机去学习做某件事情 另一个定义 什么是监督学习? 给定一组 (x,y) 样本,学习一个 x-&g…...

五、Linux目录结构
1.基本介绍 1.Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"r/",然后在此目录下再创建其他的目录。 2.深刻理解linux树状文件目录是非常重要的 3.记住一句经典的话:在Linux世界里,一切皆文件…...

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素
在这篇博客中,我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作,还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能,我们将更全面地理解这个程序的实现。 资源获取&a…...
uni-app下,页面跳转后wacth持续监听的问题处理
uni-app下,页面跳转后wacth持续监听的问题处理 好久没写博客了,最近碰到了一个uni-app(vue2)开发小程序的问题,个人觉得很典型,所以拿出来给各位做个参考。 需求场景: 全局轮询用户权限。简单…...
Python技术栈 —— 语言基础
Python基础 语法拾遗List与Tuple的区别yield关键字for in enumeratefor in zip 精彩片段测量程序用时 语法拾遗 List与Tuple的区别 ListTuple建立后是否可变可变不可变建立后是否可添加元素可添加不可添加 # list and tuple List [1, 2, 3, 4, 5] Tuple (1, 2, 3, 4, 5) p…...

redis cluster搭建
k8s部署 Redis Insight k8s部署redis集群_mob6454cc6c6291的技术博客_51CTO博客 占用的内存竟然这么小,才200M左右 随便选个节点进去,看能否连接上其他节点 redis-cli -h redis-cluster-v1-0.redis-cluster.project-gulimall.svc.cluster.local 再创建个…...
windows 11 本地运行ER-NeRF及pytorch3D安装
ER-NeRF本地运行只要梳理好依赖版本,运行起来就很顺畅 conda create -n ernerf python3.10 创建本项目虚拟环境conda install pytorch1.12.1 torchvision0.13.1 cudatoolkit11.3 -c pytorch 若windows有多个版本的cuda,需要在环境变量中切换至cuda 11.3&…...

mysql客户端navicat的一些错误合集
关于mysql的客户端的使用的一些问题 问题描述: 在使用navicat prenium客户端的时候,连接数据库出现 Table ‘performance_schema.session_variables’ doesn’t exist 错误 解决方案: 首先找到mysql的bin目录 然后winR 进入到cmd界面 输入…...

【力扣面试经典150题】(链表)K 个一组翻转链表
题目描述 力扣原文链接 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只…...

数据结构刷题
空间复杂度:临时开辟的空间、空间是可以重复利用的 递归为O(n) 时间复杂度:程序执行次数 消失的数字 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路1:利用连续的特点求等差和然后减去所有元素得到的就是消…...

【Android】设置全局标题栏
序言 在做项目的时候,有时候需要一个全局统一的标题栏,保证项目风格的统一,但是如果在每个activity上面都写一遍这个标题栏就很麻烦了,我们经常用的方法就是写个基类Activity,然后当某个Activity需要这个统一的标题栏…...

R语言的入门学习
目录 准备工作导入csv数据集选择前200行作为数据集展示数据集的前/后几N行宏观分析删除缺失值构建直方图导出为图片 R语言常见图像类型例1:散点图例2:散点矩阵图 准备工作 安装教程: R语言和RStudio的下载安装(非常简便舒适&…...

【开源】基于Vue和SpringBoot的民宿预定管理系统
项目编号: S 058 ,文末获取源码。 \color{red}{项目编号:S058,文末获取源码。} 项目编号:S058,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色…...
nacos集群部署
GitHub - nacos-group/nacos-k8s: This project contains a Nacos Docker image meant to facilitate the deployment of Nacos on Kubernetes using StatefulSets. 需要修改两个文件 --- apiVersion: v1 kind: Service metadata:name: nacos-headlessnamespace: project-guli…...

9、传统计算机视觉 —— 边缘检测
本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…...

Linux tc 使用
tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...