设计模式--介绍

2023-10-27

一、什么是设计模式

​ 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。简单说:

模式:在某些场景下,针对某些问题的某种通用的解决方案。

场景:项目所在的环境。

问题:约束条件,项目目标等。

解决方案:通用、可复用的设计,解决约束达到目标。

二、设计模式的分类

(1)按照目的分类

1、创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。

2、结构型模式:把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对象、接口之间的结构关系。

3、行为型模式:类和对象如何交互,及划分责任和算法。

(2)按照范围的分类

1、类模式处理类与子类的静态关系。

2、对象模式处理对象间的动态关系。

(3)从封装变化角度对模式分类

1.组件协作:

​ 模板方法

​ 观察者

​ 策略

2.单一职责:

​ 装饰器

​ 桥

3.对象创建:

​ 工厂方法

​ 抽象工厂

​ 原型模式

​ 构建器

4.对象性能:

​ 单例模式

​ 享元模式

5.接口隔离:

​ 观察者模式

​ 代理模式

​ 中介者模式

​ 适配器模式

6.状态变化:

​ 备忘录模式

​ 状态模式

7.数据结构:

​ 组合模式

​ 迭代器模式

​ 职责链模式

8.行为变化:

​ 命令模式

​ 访问者模式

9.领域问题:

​ 解释器模式

三、面向对象的设计原则

1.依赖倒置原则(DIP)

​ 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。

​ 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。

2.开放封闭原则(OCP)

​ 对扩展开放,对更改封闭。

​ 类模块应该是可扩展的,但是不可修改。

3.单一职责原则(SRP)

​ 一个类应该仅有一个引起它变化的原因。

​ 变化的方向隐含着类的责任。

4.Liskov 替换原则(LSP)

​ 子类必须能够替换它们的基类(IS-A)。

​ 继承表达类型抽象。

5.接口隔离原则(ISP)

​ 不应该强迫客户程序依赖它们不用的方法。

​ 接口应该小而完备。

6.优先使用对象组合,而不是类继承

​ 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。

​ 继承在某种程度上破坏了封装性,子类父类耦合度高。

​ 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

7.封装变化点

​ 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合

8.针对接口编程,而不是针对实现编程

​ 不将变量类型声明为某个特定的具体类,而是声明为某个接口。

​ 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。

​ 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案。

四、设计模式设计原则

1、单一原则(Single Responsibility Principle):一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;

a、业务对象(BO business object)、业务逻辑(BL business logic)拆分;

2、里氏替换原则(LSP liskov substitution principle):子类可以扩展父类的功能,但不能改变原有父类的功能;(本质其实就是c++的多态)

(目的:增强程序的健壮性)实际项目中,每个子类对应不同的业务含义,使父类作为参数,传递不同的子类完成不同的业务逻辑。

3、依赖倒置原则(dependence inversion principle):面向接口编程;(通过接口作为参数实现应用场景)

抽象就是接口或者抽象类,细节就是实现类

含义:

上层模块不应该依赖下层模块,两者应依赖其抽象;

抽象不应该依赖细节,细节应该依赖抽象;

通俗点就是说变量或者传参数,尽量使用抽象类,或者接口;

【接口负责定义public属性和方法,并且申明与其他对象依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑】

4、接口隔离原则(interface segregation principle):建立单一接口;(扩展为类也是一种接口,一切皆接口)

定义:

a.客户端不应该依赖它不需要的接口;

b.类之间依赖关系应该建立在最小的接口上;

简单理解:复杂的接口,根据业务拆分成多个简单接口;(对于有些业务的拆分多看看适配器的应用)

【接口的设计粒度越小,系统越灵活,但是灵活的同时结构复杂性提高,开发难度也会变大,维护性降低】

5、迪米特原则(law of demeter LOD):最少知道原则,尽量降低类与类之间的耦合;

一个对象应该对其他对象有最少的了解

6、开闭原则(open closed principle):用抽象构建架构,用实现扩展原则;

五、重构

重构获得模式 Refactoring to Patterns

1.面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指是那些可以满足 “应对变化,提高复用”的设计 。

2.现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而来更好地应对需求的变化”.“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

3.设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。

重构关键技法

​ 静态 → 动态

​ 早绑定 → 晚绑定

​ 继承 → 组合

​ 编译时依赖 → 运行时依赖

​ 紧耦合 → 松耦合

– 李建忠老师的课程笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式--介绍 的相关文章

  • js实现简单计算器

  • java文档注释

    Java 文档注释 Java 支持三种注释方式 前两种分别是 和 第三种被称作说明注释 它以 开始 以 结束 说明注释允许你在程序中嵌入关于程序的信息 你可以使用 javadoc 工具软件来生成信息 并输出到HTML文件中 说明注释 使你更

随机推荐

  • TCP/IP协议学习记录之二十七:RTP和RTMP

    以上两个协议和多媒体传输有关 所以今天特地来学习学习 转载自 https www cnblogs com yoyotl p 5650101 html https www cnblogs com lidabo p 7233154 html R
  • SLR(1)分析法

    文章目录 SLR分析法的基本思想 SLR 1 分析表的构造 LR 0 文法要求文法的每一个LR 0 项目都不含有冲突的项目 这个条件比较苛刻 对于大多数程序设计语言来说 一般都不能满足LR 0 文法的条件 例如 不难看出在状态 I 2 I
  • 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    斐波那契数列 Fibonacci sequence 又称黄金分割数列 指的是这样一个数列 0 1 1 2 3 5 8 13 21 34 如果要输出这样的数列 实际上很简单 每一个数等于前两个数之和 但如果转化为问题 能否判断出时斐波那契数列
  • 【C++登山之路之初露锋芒 2】——内联函数+ 引用+auto+nullptr关键字(万字详解,图片演示,结构原理)

    目录 1 内联函数 2 引用 2 1引用涉及的隐式类型转换和权限问题 2 2引用和指针 3 auto关键字 4 nullptr关键字 内联函数 以inline修饰的函数叫做内联函数 编译时C 编译器会在调用内联函数的地方展开 没有函数压栈的
  • Python爬虫深度优化:Scrapy库的高级使用和调优

    在我们前面的文章中 我们探索了如何使用Scrapy库创建一个基础的爬虫 了解了如何使用选择器和Item提取数据 以及如何使用Pipelines处理数据 在本篇高级教程中 我们将深入探讨如何优化和调整Scrapy爬虫的性能 以及如何处理更复杂
  • 第五周课程总结&试验报告(三)

    Java实验报告 班级 计科二班 学号 20188423 姓名 邹健 完成时间 2019 9 27 评分等级 实验三 String类的应用 一 实验目的 1 掌握类String类的使用 2 学会使用JDK帮助文档 二 实验内容 1 已知字符
  • Antd表格组件(table)可编辑单元格使用

    Antd表格组件 table 可编辑单元格使用 export default function Category const category setcategory useState 创建上下文关系对象 const EditableCon
  • 在Android5上安装termux0.118并安装Debian和桌面环境

    教程老旧 不保证能用 众所周知 官方的termux在0 73后就不支持Android5和6了 更新于2023 2 26 14 43 不限速下载 密码2023 这两个是支持Android5和6的最新版本 按照手机的架构下载 安装完成后输入 v
  • 基于人工智能与边缘计算Aidlux的工业表面缺陷检测

    一 训练yolov8得到onnx模型 相关教程有很多 二 模型转化 网站 https aimo aidlux com 输入试用账号和密码 账号 AIMOTC001 密码 AIMOTC001 我们选择 TensorFlowLite 一步步完成
  • 一篇不错的v4l2

    其实 我刚开始一直都不知道怎么写驱动 什么都不懂的 只知道我需要在做项目的过程中学习 所以 我就自己找了一个关于编写Linux下的视频采集监控项目做 然后上学期刚开学的时候听师兄说 跟院长做项目 没做出来也没关系 所以直接退出博士的团队 投
  • Xshell 7下载、安装步骤与使用教程

    Xshell 7下载 安装步骤与使用教程 一 内容 二 下载地址 三 安装步骤 四 Xshell7使用教程 一 内容 Xshell是一款功能强大的远程终端连接管理软件 支持多种远程协议 可以在多端进行高效安全的远程连接 同时还可以帮助你有效
  • IPC:信号——对内核信号集的操作

    对内核信号集的操作kernel signal set int sigprocmask int how const sigset t set sigset t oldset 功能 将自定义信号集中的数据设置到内核中 设置阻塞 解除阻塞 替换
  • LeetCode 1302. 层数最深叶子节点的和 DFS/BFS

    题目描述 给你一棵二叉树的根节点 root 请你返回 层数最深的叶子节点的和 示例 1 输入 root 1 2 3 4 5 null 6 7 null null null null 8 输出 15 示例 2 输入 root 6 7 8 2
  • 关于压力测试评定方式

    一个完整的压力测试需要关注三个方面 如何正确产生压力 如何定位瓶颈 如何预估系统承载力 1 首先说一下如何产生压力 压力方法有很多 通常可以写脚本产生压力机器人对服务器进行发包和收包操作 也可以使用现有工具 如jmeter loadRunn
  • vsCode 配置记录

    目录 1 import路径提示 2 按住ctrl点击鼠标 进入指定的文件 3 中文包安装 4 自定义函数和文件注释 4 1 快捷键不生效的处理办法 5 scss css id全局提示 5 1 scss变量 函数等全局提示 5 2 css i
  • Flutter 设置状态栏statusbar的背景颜色和文字颜色

    今天介绍如何设置状态栏的颜色和文字的颜色 本文采用通过在appbar里面的一个参数来设置 方法如下 可以定义一个基类 在基类之中进行整体的设定 也可以暴露方法 动态设置核心就是两行 很简单 return MaterialApp debugS
  • nginx负载配置,文件大小限制

    2019独角兽企业重金招聘Python工程师标准 gt gt gt user nobody worker processes 1 error log logs error log error log logs error log notic
  • Spring Data 与MongoDB 集成一:入门篇(开发环境搭建和简单CRUD)

    一 简介 SpringData 项目提供与MongoDB文档数据库的集成 二 SpringData 与MongoDB 配置及对应Jar包 1 安装mongodb 数据库 请查考 待补充 2 下载spring data 关联两个子项目 spr
  • 洛谷千题详解

    博主主页 Yu 仙笙 专栏地址 洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析 C 源码 C 源码2 C 源码3 Pascal源码 Java源码
  • 设计模式--介绍

    一 什么是设计模式 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可靠性 毫无疑问 设计模式于己于他人于系统都是多赢