什么是设计模式?

设计模式,其实就是对软件设计过程中普遍存在、反复出现的各种问题,所提出的解决方案。

而所谓的软件设计,是软件工程方面的一个名词,在现代的软件开发过程中,并不是确定好了项目之后就立刻敲代码,而是要先构思好整个项目的架构、模块、流程。

如果是多人协作开发,项目设计就变得更加重要,不然每个人都自己做自己的,必然会出现功能重复、代码冗余、接口不匹配等问题,所以在开发前分好工,不同的组不同的人负责不同的模块,这样才能让开发更加丝滑顺畅。

在项目设计的过程中要非常细致,根据需求编写相应的功能,再利用面向对象相关的知识,将功能细分到不同的类中

每一个设计模式系统地命名、解释和评价了面向对象中一个重要的设计思路。

面向对象

面向对象的三大特性相信大家都已经很熟悉了:封装、继承、多态。

这三大特性的顺序是固定的,它们三个并不是并列的关系,而是递进的关系。

开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象。

依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。

接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

创建型模式

简单工厂模式

内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。

优点:
隐藏了对象创建的实现细节
客户端不需要修改代码

缺点:
违反了单一职责原则,将创建逻辑几种到一个工厂类里
当添加新产品时,需要修改工厂类代码,违反了开闭原则

工厂方法模式

内容:定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类。

优点:
每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
隐藏了对象创建的实现细节

缺点:
每增加一个具体产品类,就必须增加一个相应的具体工厂类

抽象工厂模式

内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。

优点:
将客户端与类的具体实现相分离
每个工厂创建了一个完整的产品系列,使得易于交换产品系列
有利于产品的一致性(即产品之间的约束关系)

缺点:
难以支持新种类的(抽象)产品

建造者模式

内容:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。

优点:
隐藏了一个产品的内部结构和装配过程
将构造代码与表示代码分开
可以对构造过程进行更精细的控制

单例模式

内容:保证一个类只有一个实例,并提供一个访问它的全局访问点。

优点:
对唯一实例的受控访问
单例相当于全局变量,但防止了命名空间被污染

创建型模式小结

抽象工厂模式和建造者模式相比于简单工厂模式和工厂方法模式而言更灵活也更复杂。

通常情况下、设计以简单工厂模式或工厂方法模式开始,当你发现设计需要更大的灵活性时,则像更复杂的设计模式演化。

结构型模式

适配器模式

内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

桥模式

内容:
将一个事物的两个维度分离,使其都可以独立地变化。

应用场景:
当事物有两个维度上的表现,两个维度都可能扩展时。
优点:
抽象和实现相分离
优秀的扩展能力

组合模式

内容:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

适用场景:
表示对象的“部分-整体”层次结构(特别是结构是递归的)
希望用户忽略组合对象与单个对象的不同,用户统一地使用组合结构中的所有对象
优点:
定义了包含基本对象和组合对象的类层次结构
简化客户端代码,即客户端可以一致地使用组合对象和单个对象
更容易增加新类型的组件

外观模式

内容:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

优点:
减少系统相互依赖
提高了灵活性
提高了安全性

代理模式

内容:为其他对象提供一种代理以控制对这个对象的访问。

应用场景:
远程代理:为远程的对象提供代理
虚代理:根据需要创建很大的对象
保护代理:控制对原始对象的访问,用于对象有不同访问权限时

行为型模式

责任链模式

内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用场景:
有多个对象可以处理一个请求,哪个对象处理由运行时决定
在不明确接收者的情况下,向多个对象中的一个提交一个请求
优点:
降低耦合度:一个对象无需知道是其他哪一个对象处理其请求

观察者模式

内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者模式又称“发布-订阅”模式

适用场景:
当一个抽象模型有两方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
优点:
目标和观察者之间的抽象耦合最小
支持广播通信

策略模式

内容:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

优点:
定义了一系列可重用的算法和行为
消除了一些条件语句
可以提供相同行为的不同实现
缺点:
客户必须了解不同的策略

模板方法模式

内容:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用场景:
一次性实现一个算法的不变的部分
各个子类中的公共行为应该被提取出来并集中到一个公共父类中以避免代码重复
控制子类扩展

做项目开发你必须得掌握的知识:设计模式相关推荐

  1. 7 个让您需要渐进式 Web 应用程序做项目开发的理由

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 自从渐进式Web应用程序(PWA)诞生以来,许多公司已开始利用这个新平台来增强用户体验并扩展新的用户群.其中 ...

  2. 刚开始用 Go 做项目开发时都会面临哪些问题?

    我身边几个朋友,当初掌握Go的时候都是硬赶着上架,语法还没完全掌握就投入到项目开发中.因为有了前人在企业项目里打好的基础,一开始我们就是写业务,感觉跟在前人定好的大纲里做填空题一样,后来慢慢上手后才更 ...

  3. 使用Gitlab的Issues做项目开发的缺陷管理

    一.引言 在项目开发过程中,除了可以使用类似禅道.JRA等缺陷管理工具,还可以使用GitLab的Issues做项目缺陷管理. 二.Issues缺陷管理的使用 1.创建Label标识 ①:选择项目的左侧 ...

  4. 智能家居项目开发(一):简单工厂设计模式引入

    智能家居项目开发 一.智能家居功能细节拆分 二.设计模式概念的引入 三.类与对象 四.结构体新玩法 五.工厂模式 一.智能家居功能细节拆分 1.控制区 我们会用到之前学过的: 语音识别模块 socke ...

  5. linux python 修改了但是运行源文件没有改_L2u在帮老师做项目的过程中学到的Linux知识...

    ①Linux中经常出现需要root权限才能做的事情,比如删除某个文件夹下的文件(通常是关键文件夹),那root权限是什么呢? Linux系统下有一个root用户,这个用户享有本系统的最高权限,可以删除 ...

  6. C++项目开发SDK中的回调函数

    本篇博客不会给大家举什么复杂的例子,就是短短几行文字,让大家就能明白回调函数的简单应用.至于很复杂的应用比如同步回调,异步回调我们一般做项目开发也涉及不到,这里也不做过多的赘述. 什么是回调函数:如果 ...

  7. 【毕设|Java项目开发合集】(附源码)

    [毕设|Java项目开发合集] 14个Java项目(附源码)助你轻松搞定毕业设计! 1.新冠疫情统计系统 2.家教系统 3.进销存管理系统 4.饮食分享平台 5.宠物领养平台 6.销售评价系统 7.酒 ...

  8. java实践项目_Java项目开发实践

    第章项目开发基础() 项目开发实训目标() 实训知识目标() 实训能力目标() 实训素质目标() 项目开发技术() 图形用户界面编程技术() 输入输出编程技术() 网络编程技术() 数据结构编程技术( ...

  9. 【Day11】平时在项目开发中都做过哪些前端性能优化

    平时在项目开发中都做过哪些前端性能优化 一.体验优化 二.提升页面性能 三.首页加载优化(减少白屏时间) 一.体验优化 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提 ...

最新文章

  1. 规范的 Commit Message
  2. Ajax弹出式无刷新城市选择特效
  3. 权力的游戏登录显示服务器上限,权力与纷争登录不了怎么办_权力与纷争服务器连不上解决办法_玩游戏网...
  4. 学习Unix/Linux编程要学些什么
  5. boost::sort模块实现整数排序与右移函子反向排序示例
  6. JVM调优: 转载JVM调优总结
  7. IFC标准是什么标准?IFC标准的发展历程是怎样的?
  8. unity安装后 启动失败_Unity3D插件安装常见问题说明
  9. 逻辑清晰四个实用原则(金字塔原理)
  10. wps目录怎么加一条_wps目录怎么自动生成目录?目录自动生出方法介绍
  11. ioi2020集训队作业_IOI2020集训队作业
  12. 黑客突破防火墙常用的几种技术(转)
  13. 网易考拉海购Java开发面经(已拿offer)
  14. 从零开始学微信小程序开发:1
  15. Docker数据卷挂载相关
  16. 将树莓派变成行车记录仪
  17. Code Review 在丁香医生前端团队的实践
  18. 关于C++中的一些特殊函数inline,virtual等等
  19. 摄影后期,教你如何塑造光影营造照片的氛围
  20. Struts维基百科,自由的百科全书

热门文章

  1. Python异常体系结构图
  2. 在 Linux 上安装 Oracle 数据库 11g
  3. 51nod 1222 最小公倍数计数【莫比乌斯反演】
  4. js 前加分号和感叹号的含义
  5. 【微信小程序】——实战开发之和风(含demo)
  6. 混沌分形之逻辑斯蒂(Logistic)映射系统
  7. UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
  8. Android与Linux以及GNU的关系
  9. 替换用FTP传到Unix上的文件中的^M字符
  10. css什么是自适应布局,CSS自适应布局