设计模式 - 概览

一、概念

分为三大类、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)按顺序发送时间给观察者,观察者按顺序接收时间并做出响应。

●推模型:不管观察者是否需要都推送主题的详细信息。

●拉模型:若观察者需要更具体的信息,由观察者主动到主题主题对象中获取。

模板方法模式定义一个模板结构,将具体内容延迟到子类去实现。实现了反向控制,通过父类调用其子类的操作,通过对子类的具体实现扩展不同的行为。将相同部分的代码放在抽象的父类中,将不相同的代码放入不同的子类中。一次性实现一个算法的不变部分,将可变的行为留给子类来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

观光奶牛 (01分数规划、负环)

01分数规划问题:类似于观光奶牛这个题中的,求的路径上的点权值和与边权值和的商最大最小。 当前问题的推到如下: 该问题其实可以用二分图来解决, 在不断的二分答案中获取符合条件的最大值。然后问题就转化为如何是否存在和为mid的…

Vue3中的pinia使用,入门教程

文章目录 文章目录 pinia组成部分 pinia使用流程 注意Store获取到后不能解构,否则失去响应式 一、pinia原理? 功能:管理全局共享数据,pinia与vuex功能一样优势:pinia相对于vuex增加了对ts的支持,对响应式的…

程序员如何“升级打怪”?我用了这几个“歪瓜”!

不会吧?不会吧?计算机本命专业出身、以及半路出家的,混了几年了,还在新手村?对得起这几年摸的鱼? 思考一下:如何从小白一跃为大师,从此走上人生巅峰、迎娶白富美?变强只…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

3.基于多能互补的热电联供微网优化运行复现(matlab代码)

0.代码链接 基于多能互补的热电联供微电网/综合能源系统优化运行(Matlab程序Yalmip+Cplex求解)_工业综合能源系统资源-CSDN文库 2. 主要内容:代码主要做的是多能互补的热电联供型微网优化运行模型,在需求侧对负荷类型…

hive数据库将非分区表数据迁移到分区表

文章目录 一、非分区表数据迁移到分区表 一、非分区表数据迁移到分区表 业务运行一段时间后非分区表的数据量非常大,需要创建一张分区表并将数据迁移到分区表中。 原表建表语句: create table user(id String default null comment 主键id,name St…

c# 文件操作

文件操作 namespace demo1;class proj {/// <summary>///文件&#xff1a;///注册表是Micrsoft windows 中的一个重要的数据库&#xff0c;用于存储系统和应用恒旭的设置信息///主要了解文件和注册表的创建、打开、读取、写入、修改、删除/// </summary>//////文件…

Android Studio 引入Xui框架-简单应用

Android Studio Flamingo | 2022.2.1 Patch 2 Android 11开发、Gradle Version 8.0、 jdk17 源代码&#xff1a;GitHub - xuexiangjys/XUI: &#x1f48d;A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架&#xff…

【Chrony】一个多功能的NTP实现

在现代的计算机系统中&#xff0c;准确的时间同步对于许多关键应用和系统的正常运行至关重要。Linux操作系统提供了多种时间同步工具&#xff0c;其中Chrony是一款备受推崇的工具&#xff0c;为Linux系统提供了更准确、更稳定的时间同步功能。本文将介绍Chrony的工作原理、优点…

亚信面试题

文章目录 2.Java基本数据类型?3.对象三大特征?4.多态和封装的含义及作用?5.方法重写和方法重载的区别?6.String/StringBuffer和StringBuilder区别?7.String常用方法有哪些?8.==和equals有什么区别?9.两个对象hashCode相同equals为true吗?10.ArrayList和LinkedList有什么…

WordPress网站迁移实战经验

前几日,网站服务器到期,换了服务商,就把我的WordPress的网站迁移到本地电脑了。方便以后文章迁移。 本次迁移网站主要经历以下几个步骤。 1.域名转出。 2.备份数据库及网站文件下载。 3.重新搭建WordPress网站。 4.网站文件及数据库导入。 下面详细介绍下每个步骤的操作…

Linux 安全 - 扩展属性xattr

文章目录 前言一、简介二、扩展属性命名空间2.1 简介2.2 security扩展属性2.3 System扩展属性2.4 Trusted扩展属性2.5 User扩展属性 三、用户空间使用3.1 setfattr/getfattr3.2 setxattr/getxattr/listxattr 参考资料 前言 一、简介 xattr - Extended attributes扩展属性是与…

【狂神说Java】redis

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;【狂神说Java】 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c…

【done】剑指 Offer 53 - II:0~n-1中缺失的数字

力扣&#xff0c;https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/description/ solution1 线性扫描&#xff0c;一般情况 class Solution {public int takeAttendance(int[] records) {boolean[] visited new boolean[records.length 1];Arrays.fill(visited, fals…

解压过大文件(超过4GB)传输至服务器的问题

不能在终端执行unzip指令了。 1、通过终端 7za x 文件名.zip 2、通过jupyter notebook代码来解决 import zipfilef zipfile.ZipFile("dataset.zip",r) # 压缩文件在jupyter中的位置 for file in f.namelist():f.extract(file,"./dataset") …

docker部署gitlab 12.10.6过程

docker部署gitlab 12.10.6过程 1.docker安装 docker指定版本安装【官方文档步骤】 官方文档地址&#xff1a;https://docs.docker.com/engine/install/centos/ # 1.安装yum工具及设置docker-ce镜像库 sudo yum install -y yum-utils# 国外的镜像下载太慢了改成阿里云镜像库 s…

pipeline传参给job

场景&#xff1a;pipeline实现自动部署&#xff0c;job实现自动测试&#xff0c;但是只有部署dddd环境时&#xff0c;才调自动测试的job&#xff0c;所以需要在调自动测试job时&#xff0c;把参数传给测试job 上一个任务会显示下一步调谁 ------------------------------------…

解决:ERR This instance has cluster support disabled

问题描述 在使用Redisson做分布式锁&#xff0c;连接redis时&#xff0c;提示以下错误&#xff1a; 问题定位 通过指令&#xff1a; cluster nodes查看&#xff0c;发现 出现这种提示的原因&#xff0c;是因为此Redis实例已经禁用了集群(默认状态下是禁用状态)。 解决 …

Flowable工作流高级篇

文章目录 一、任务分配和流程变量1.任务分配1.1 固定分配1.2 表达式分配1.2.1 值表达式1.2.2 方法表达式 1.3 监听器分配 2.流程变量2.1 全局变量2.2 局部变量2.3 案例讲解 二、候选人和候选人组1.候选人1.1 定义流程图1.2 部署和启动流程实例1.3 任务的查询1.4 任务的拾取1.5 …

Linux进程通信——消息队列

概念 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点 1.消息队列是面向记录的&#xff0c;其中的消息具有特定的格式以及特定的优先级。&#xff08;消息队列是结构体&#xff09; 2.消息队列独立于发送与接…