设计模式-笔记

news2025/1/16 19:12:26

文章目录

      • 七大原则
      • 单例模式
      • 桥模式 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 处理来自多个生产商的多组产品
抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件
例:新增一个键盘产品类
在这里插入图片描述在这里插入图片描述

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

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

相关文章

Postgresql中的unlogged table

在PG中,有一种表的类型为unlogged table,名如其字,该种类型的表不会写入wal日志中,所以在写入的速度上比普通的堆表快很多,但是该表在数据库崩溃的时候,会被truncate,数据会丢失,而且该表也不支…

Leetcode21. 合并两个有序链表

一、题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4]输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2…

Java程序开发中如何使用lntelliJ IDEA?

完成了IDEA的安装与启动,下面使用IDEA创建一个Java程序,实现在控制台上打印HelloWorld!的功能,具体步骤如下。 1.创建Java项目 进入New Project界面后,单击New Project选项按钮创建新项目,弹出New Project对话框&…

【k8s】Kubernetes的学习(1.k8s概念和架构)

目录 1.首先要知道,Kubernetes为什么简称为k8s? 2.Kubernetes概述 2.1 kubernetes基本介绍 2.2 kubernetes的特性 2.3 kubernetes集群架构组件 2.3.1 Master (主控节点) 2.3.2 node (工作节点) 2.4 k8s核心概念 2.4.1 Pod 2.4.2 controller 2.4.3 Se…

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该…

redux-saga

redux-saga 官网:About | Redux-Saga 中文网:自述 Redux-Saga redux-saga 是一个用于管理 异步获取数据(副作用) 的redux中间件;它的目标是让副作用管理更容易,执行更高效,测试更简单,处理故障时更容易… …

C#:Krypton控件使用方法详解(第十讲) ——kryptonColorButton

今天介绍的Krypton控件中的kryptonColorButton,下面介绍这个控件的外观属性:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:EmptyBorderColor属性:表示当所选颜色为空时&#x…

七、JUC并发工具

文章目录JUC并发工具CountDownLatch应用&源码分析CountDownLatch介绍CountDownLatch应用CountDownLatch源码分析有参构造await方法countDown方法CyclicBarrier应用&源码分析CyclicBarrier介绍CyclicBarrier应用CyclicBarrier源码分析CyclicBarrier的核心属性CyclicBarr…

echarts实现知识图谱,生产项目

echarts实现知识图谱,生产项目内容简介效果演示代码逻辑结束语内容简介 在实际生产项目中,需要对后端知识数据进行展示。需求如下: 点击节点可以展示与此节点相关的节点信息右键点击节点可以对节点的信息进行修改悬浮在节点上可以查看节点的…

通用人工智能(AGI):人工智能的下一个阶段

除了人工智能(AI)的改进和新应用之外,大多数人都认为,当通用人工智能(AGI)出现时,人工智能的下一次飞跃将发生。我们将AGI宽泛地定义为机器或计算机程序理解或学习人类可以完成的任何智力任务的假设能力。然而,对于何时以及如何实…

系统性能测试指标

性能测试的目的 1.评估系统的能力,测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力,并帮助作出决策。 2.识别体系中的弱点:受控的负荷可以被增加到一个极端的水平,并突破它,从而修复体系的瓶颈或薄…

leetcode: Swapping Nodes in a Linked List

leetcode: Swapping Nodes in a Linked List1. 题目描述2. 题目解答3. 总结1. 题目描述 You are given the head of a linked list, and an integer k.Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node f…

ECMAScript 详解

ECMAScript 历史我们首先来看 ECMA 是什么。ECMA,是欧洲计算机制造商协会(European Computer Manufacturers Association)的简称,是一家国际性会员制度的信息和电信标准组织。1994 年之后,由于组织的标准牵涉到很多其他…

【Leetcode 剑指Offer】第 6 天 搜索与回溯算法(简单)

搜索与回溯剑指 Offer 32 - I. 从上到下打印二叉树层序遍历 广搜 BFScollections双端队列 deque剑指 Offer 32 - II. 从上到下打印二叉树 II剑指 Offer 32 - III. 从上到下打印二叉树 III剑指 Offer 32 - I. 从上到下打印二叉树 题;从上到下打印出二叉树的每个节点&#xff0c…

单通道说话人语音分离——DPRNN(Dual-Path Recurrent Neural Network)

参考文献:《DUAL-PATH RNN: EFFICIENT LONG SEQUENCE MODELING FOR TIME-DOMAIN SINGLE-CHANNEL SPEECH SEPARATION》 DPRNN网络是Con-Tasnet的改进网络 Con-Tasnet介绍详情请看上一篇文章 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio…

应用程序性能优化方案,web服务五级缓存优化,服务器性能优化...

winfrom 全局异常捕获WPF 全局异常捕获Asp.Net全局异常捕获MVC 全局异常捕获AspNetNetCore 全局异常捕获一级缓存html/css/js 前端缓存二级缓存Asp.Net MVC AspNetCore 客户端缓存设置三级缓存服务端缓存四级redis 数据库缓存服务端缓存五级sqlserver 数据库缓存设置分布式缓存…

2023年湖北建设厅资料员证怎么考需要什么条件?启程别

2023年湖北建设厅资料员证怎么考需要什么条件?启程别 湖北资料员目前已经开始组织考试了,各位想要考资料员的现在可以开始准备报考相关准备工作了。资料员怎么考需要什么条件?启程别告诉你 建设厅资料员证怎么考 网报:七大员全国…

ARM学习(十八)jinkozone调试问题总结

笔者来聊聊ARM的函数的调用规则 1、ARM函数调用规则介绍首先介绍几个术语, AAPCS:Procedure Call Standard for the ARM Architecture APCS:ARM Procedure Call Standard TPCS:Thumb Procedure Call Standard ATPCS:AR…

5.3 redis分布式锁【Java 面试第三季】

redis分布式锁【Java 面试第三季】前言推荐redis分布式锁概览47_redis分布式锁前情说明48_boot整合redis搭建超卖程序-上49_boot整合redis搭建超卖程序-下50_redis分布式锁0151_redis分布式锁0252_redis分布式锁0353_redis分布式锁0454_redis分布式锁0555_redis分布式锁0656_re…

【Java|golang】2363. 合并相似的物品---桶排序

给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一的 。 请你…