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

设计模式--开篇

什么是设计模式

设计模式是软件开发过程中面临的通用问题的解决方案。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性

按使用目的分类

创建型–主要用于创建对象

  1. 单例模式-某个类只能有一个实例,提供一个全局的访问点
  2. 工厂方法模式-创建对象而不将创建逻辑暴露给客户端
  3. 抽象工厂-也称为工厂的工厂,由一个工厂创建其他工厂
  4. 建造者-封装一个复杂对象的构建过程,并可以按步骤构造
  5. 原型-通过复制现有的实例来创建新的实例

行为型–主要用于描述对类或对象怎样交互和怎样分配职责

  1. 访问者—在不改变数据结构的前提下,增加作用于一组对象元素的新功能
  2. 模板方法 --定义一个算法结构,而将一些步骤延迟到子类实现
  3. 策略 --定义一系列算法,把他们封装起来,并且使它们可以相互替换
  4. 状态 --允许一个对象在其对象内部状态改变时改变它的行为
  5. 观察者(事件发布订阅模式) --对象间的一对多的依赖关系
  6. 备忘录 --在不破坏封装的前提下,保持对象的内部状态
  7. 中介者 --用一个中介对象来封装一系列的对象交互
  8. 迭代器 --一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构
  9. 解释器 --给定一个语言,定义它的文法的一种表示,并定义一个解释器
  10. 命令 --将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
  11. 责任链–将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会

结构型–主要用于处理类或对象的组合

  1. 适配器–将一个类的方法接口转换成客户希望的另外一个接口
  2. 桥接模式–将抽象部分和它的实现部分分离,使它们都可以独立的变化
  3. 组合模式–将对象组合成树形结构以表示“部分-整体”的层次结构
  4. 装饰器–动态的给对象添加新的功能
  5. 外观—对外提供一个统一的方法,来访问子系统中的一群接口
  6. 享元模式–通过共享技术来有效的支持大量细粒度的对象
  7. 代理模式–为其他对象提供一个代理以便控制这个对象的访问

按使用范围分类

类模式–处理类和子类之间的关系,这些关系通过继承建立

  1. 工厂方法模式
  2. 类-适配器
  3. 模板方法
  4. 解释器

对象模式–处理对象间的关系,这些关系在运行时刻变化

  1. 抽象工厂
  2. 建造者
  3. 原型
  4. 单例模式
  5. 对象-适配器
  6. 桥接模式
  7. 组合模式
  8. 装饰器
  9. 外观
  10. 享元模式
  11. 代理模式
  12. 责任链
  13. 命令
  14. 迭代器
  15. 中介者
  16. 备忘录
  17. 观察者
  18. 状态
  19. 策略
  20. 访问者

设计模式六大原则

单一原则

一个类只负责一项职责,尽量做到类只有一个行为原因引起变化;
业务对象(BO business object)、业务逻辑(BL business logic)拆分

里氏替换原则

子类可以扩展父类的功能,但不能改变原有父类的功能;
目的:增强程序的健壮性。实际项目中,每个子类对应不同的业务含义,使父类作为参数,传递不同的子类完成不同的业务逻辑

依赖倒置原则

面向接口编程;(通过接口作为参数实现应用场景)
依赖于抽象而不依赖于具体。
抽象就是接口或者抽象类,细节就是实现类
依赖倒置原则定义:
上层模块不应该依赖下层模块,两者应依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口负责定义public属性和方法,并且申明与其他对象依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑

接口隔离

建立单一接口;(扩展为类也是一种接口,一切皆接口)。
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度。
降低依赖,降低耦合。
定义:
客户端不应该依赖它不需要的接口;
类之间依赖关系应该建立在最小的接口上

迪米特原则

最少知道原则,尽量降低类与类之间的耦合;
一个对象应该对其他对象有最少的了解,
即一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立

开闭原则

用抽象构建架构,用实现扩展原则;
开闭原则就是说对扩展开放,对修改关闭。
一个软件实体通过扩展来实现变化,而不是通过修改原来的代码来实现变化。
实现一个热插拔的效果。
开闭原则是对软件实体的未来事件而制定的对现行开发设计进行约束的一个原则

http://www.lryc.cn/news/223107.html

相关文章:

  • Android 原生进度条ProgressBar【自带】【水平风格】自定义
  • Nginx实现tcp代理并支持TLS加密实验
  • vue3+setup 解决:this.$refs引用子组件报错 is not a function
  • 189. 轮转数组
  • com.alibaba:tools:jar com.alibaba:jconsole:jar
  • 洛谷 P1020 [NOIP1999 普及组] 导弹拦截【一题掌握三种方法:动态规划+贪心+二分】最长上升子序列LIS解法详解
  • golang的管道阻塞问题
  • 用HTML + javaScript快速完成excel表格信息除重并合并
  • 高性能网络编程 - The C10M problem
  • java计算机毕业设计SpringBoot在线答疑系统
  • Doc as Code (4):使用Git做版本管理,而不是使用目录做版本管理
  • 【Codeforces】 CF1870E Another MEX Problem
  • 【Objective-C】Objective-C汇总
  • 怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数
  • 浅谈Elasticsearch查询和搜索
  • SLAM从入门到精通(被忽视的基础图像处理)
  • 【C++】继承详解
  • react:swr接口缓存
  • 2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python
  • 【JAVA学习笔记】66 - 本章作业(IO流)
  • vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案
  • Elasticsearch:在 ES|QL 中使用 DISSECT 和 GROK 进行数据处理
  • 基于自适应自回归模型的高级人工智能概念及其实现
  • windows的mysql启动错误,查看windows日志
  • centos7部署Canal与Canal集成使用
  • C语言--分段函数--switch语句
  • 动态规划31(Leetcode188买卖股票的最佳时机4)
  • npm包管理相关命令
  • 2023年Q3乳品行业数据分析(乳品市场未来发展趋势)
  • 软考 系统架构设计师系列知识点之边缘计算(2)