设计模式总结

篇幅较长,建议收藏阅读;
底部有公众号、源码等,可先根据目录到最下面扫码关注或 star 源码;

战术总结

  从开始学设计模式到现在,算是学了两遍,但是这玩意怎么说呢,不是说学了就能会的那种,是需要经过一段时间的沉淀和积累的,有条件的话最好能直接上生产,但是需要注意项目的风险性接受程度;
   一般来说,从项目的迭代之初,这个时间点是最考验我们的设计、架构思维的,如果在这个阶段你能有机会去参与到 代码规范审查、代码结构设计,那请收起你那不要钱的面子,这个时候就是你展现自己装逼实力的时候,往上奥力给,其实这个阶段如果你已经具备丰富的业务能力+你拥有较为丰富的架构思维,你可以自己尝试通过各种设计组合去完成项目的初始化!但是这里有个问题,你要因为自己设计出问题而买单;
  如果你是个偶像实习生或者是个职场小鲜肉,那你是幸运的,你可以有个pm来帮你承担部分风险,最起码在review的时候能看出一点小问题,相当于给你写的代码免费提供了保险,小伙子,买保险不咯,那种可以让你随便写代码的保险哦!这个时候是可以让自己在代码设计方面有个很大的提升,多尝试才能成功吗,对吧,而且这部分业务可能也不是核心,所以大胆尝试吧!

看看图片

  这是张设计模式的关系图,大家应该也能看出来,但是没啥用吧?哈哈哈,可能吧,凑个数,这样好看点,其实我们从图中我们可以得出一个结论:设计模式是组合在一起使用的,那样可以将整个业务都结合起来,对于有很强代码阅读能力的人来讲,看完代码,业务也就了解了(当然我是菜鸟,哈哈哈,之前看我pm的代码,还是挺容易渗透到业务层面的)
  这张图看看就得了,没必要发大时间总是想着去关联他们,到后面用的多了,自然而然就熟悉了,就会有一种从化神到飞升的感觉,一下子就悟了!

设计原则

  规约,是的可以这么理解,为了让代码统一,才有了这些原则,能够让代码的质量更高,不管谁写的代码,大家都能读懂,写代码随心所欲并不是个好事,大家都要守规矩的,才不会浪费别人的时间,而设计原则就是起到这个作用的!

单一职责原则

字面上来看,就是每个对象都应该有自己的职责,别人不会影响自己,自己也不能插手去管别人;

比较官方的说法:

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,是面向对象的五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因,该原则由罗伯特·C.马丁(Robert C.Martin)在《敏捷软件开发:原则、模式与实践》一书中提出。

举个栗子 :一个装油的油壶,我们就不应该在赋予他装饮用水的功能,那这样每次我们用的时候还需要最前置的清洗,这样功能混在一起,需要花费很多时间去维护,这样得不偿失!

开闭原则

在面向对象编程领域中,开闭原则 规定“软件中的 对象__,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的 ”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。引用自百度百科;

开闭原则(Open-Close Principle,OCP):就是对类的高度封装,不要去破坏原有的代码,我们可以基于他去进行扩展,或者通过方法去暴露他的属性;

举个很简单的例子 :我们设计一个类,他具备了A功能给C这个类使用,突然B这个类觉得A功能不适合自己,然后偷偷的(很多业务不知道的情况下,我们不能随便更改之前的功能)将A功能改成适合自己的A1功能,那这个时候C类就无法使用了,就要骂娘了!

里氏替换原则

啧啧,都是人,为啥差距这么大呢,都已人家名字进行命名:

里氏替换原则(Liskov Substitution Principle,LSP)是由麻省理工学院计算机科学系教授芭芭拉·利斯科夫(Barbara Liskov)于 1987 年在“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstractionand Hierarchy)里提出的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立。

这个原则大部分是限制在继承之上的,大概可以分为几种情况:

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的方法

  • 子类可以有自己独特的方法

  • 子类的入参需要更加宽松,比如父类接收参数ArrayList,那么子类应该要能接收ArrayList及其父类

  • 子类的返回值,因该是父类可以接收的类型,父类返回List,子类则需要返回List的本身和实现者

这个原则,可以让我们的代码健壮性加强,而且扩展性也会有一定的提升,以及新需求介入的时候,代码侵入性引起的风险也会降低

迪米特法则原则

1987年秋天,迪米特法则由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等人普及。后来,因为经典著作The PragmaticProgrammer而广为人知。迪米特法则(Law of Demeter,LoD)又称为最少知道原则(Least KnowledgePrinciple,LKP),是指一个对象类对于其他对象类来说,知道得越少越好。也就是说,两个类之间不要有过多的耦合关系,保持最少关联性。

迪米特法则的暗语:不要和陌生人讲话哦,跟自己朋友聊就行了!

举个栗子 :部门的事业部经理想要知道整个部门的收入,他肯定是去找各个产品部的经理询问数据然后拿出24K黄金的计算器开始求和,这里事业部经理肯定是不知道他们是怎么统计出来的,可能是底层打工人程序员从数仓里面拿出来的,也可能是dba从dts里面统计出来的,但是事业部总经理是不知道的,也不能知道,去自个写代码统计,然后各种数据不对!!其实也有但各司其事的意思;

接口隔离原则

《代码整洁之道》的作者Robert C.Martin于2002年给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced todepend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class toanother one should depend on the smallest possible interface)。

接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含调用方需要用到的方法。

举个栗子:我们设计一个接口,叫容器,我在其里面定义了,装水、装油、装大米三个方法;然后我用我现在有个麻袋,去实现这个容器,这就有问题了,我只需要有装大米的功能,现在我还要去实现装水、装油,我根本实现不了,这个时候在代码里面只能不做任何处理,这样导致无用代码大量增加;而如果容器只提供装东西的功能,我在写一个接口:大米容器,里面只有装大米的功能,这个时候只需要实现一个方法就行,虽然这样类会多了不少,但是对于后续扩展就会减少很多无用代码段;

依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP)是指在设计代码架构时,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。在Spring生态中,我们在实际的c层或者其他的si(ServiceImpl)层级ddd下的manager层我们都应该只注入接口,而不是去注入ServiceImpl 。

简单来讲:最好不要两个实现类互相调用,而是使用其接口进行调用

举个栗子 :比如A接口有A1、A2两个方法,然后B类和C类分别实现一个方法,B-A1,C-A2,然后有个D类现在要用A中的方法,他可以选择分别引入 B类和C类,然后去调用,这样就多了很多无效的代码,引入A就可以了,就像我们平时的MVC模式下,我们一般在controller一般都是引入Service层的接口,不会去引入实现类!

合成复用原则

合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。简言之:要尽量使用组合/聚合关系,少用继承。

这个原则用的很少,继承的扩展性很强,所以里氏替换我是觉得有点冲突,不多讲,聚合关系是很好用的一种思想,这个可以参考借鉴的,这个原则我有点没吃透,大家可以补充!


创建型模式

使用花里胡哨的方式创建对象,其实就是将创建对象的过程给隐藏起来了,然后根据某些规则获取这些对象,使其可以更加方便的使用,无需去new,这样更灵活!

工厂模式(Factory Pattern)

工厂模式也称简单工厂模式,是创建型设计模式的一种,这种设计模式提供了按需创建对象的最佳方式。同时,这种创建方式不会对外暴露创建细节,并且会通过一个统一的接口创建所需对象;

其主要作用就是减少if else,然后对对象的创建进行统一的管理;

但是他也会存在一个问题,如果需要创建的类型过多,也会导致工厂类里面的if else大量增加,去维护对应的type也是需要花费一定时间的,而且功能类的数量也会大量增加;

举个例子 :创建一个接口,容器(Column: 抽象产品类),然后有存液体的功能;然后有两个实现类(WaterColumn:具体产品类)、(TeaColumn:具体产品类),再通过工厂类(ColumnFactory:工厂类,这里)去根据不同类型,选择行创建不同功能类,想喝茶就去创建 Tea;大概就是如此!

看看图:

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

这里可以理解为,一个很大的工厂,比如电脑厂(ComputerFactory),他可能旗下还有 屏幕厂(MonitorFactory)、硬盘厂(HardDiskFactory)等,这里电脑厂就是抽象工厂,然后子厂再去生产指定的东西(功能类);

其实这种模式在平时开发用的不算多,大多数情况下通过简单工厂就能完成,而且这种模式下,会导致子类工厂需要去实现自己没有的功能,这样不算符合接口隔离原则,但是我们可以稍作修改,看下图,我们可以在新增一个中间实现(CommonFactory),他不做任何处理,就替代功能类去实现自己没能力完成的功能,他自己的作用就是减少冗余的无用的代码;

看看图:

单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一(主要减少内存占用)。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

可以总结出一条经验,单例模式主要解决的是一个全局使用的类,被频繁地创建与销毁,从而提升代码的整体性能;

这个模式没什么好说的,是比较简单的,主要目的就是为了减少对象频繁创建而浪费内存

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的,相当于聚合其他的类,完成最终可供选择的产品;这里可以抽象为表示与构建过程进行分离,客户端只需关注表示出来的东西;

建造者模式的经典案例就是lombok的@Builder注解,提供建造者模式去构建自己最后想要的对象,这里没有用的小伙伴可以去试试;

这里举个栗子 :有个电脑店(ComputerBuilder),他有很多材料可以使用,最后需要给出几套方案:有高配的、中配的、低配的;顾客想买的话就直接提走就行了,不需要自己组装电脑(当然向我们程序员肯定是要自己体验组装的乐趣了

两万字长文-设计模式总结相关推荐

  1. 两万字长文总结,梳理 Java 入门进阶那些事

    两万字长文总结,梳理 Java 入门进阶那些事 先给大家看下完整的思维导图,也是这篇文章的主要脉络. Java从入门到进阶学习路线 主导三个项目,让我独当一面 能力提升你要怎么学 全篇总结 Java ...

  2. 两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)

    两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏) 程序员小跃 2021-01-12 13:19:09  23  收藏 分类专栏: Java学习之路 文章标签: java 数据库 redis ...

  3. 过程或函数的副作用是_Python函数和函数式编程(两万字长文警告!一文彻底搞定函数,建议收藏!)...

    Python函数和函数式编程 函数是可重用的程序代码段,在Python中有常用的内置函数,例如len().sum()等. 在Pyhon模块和程序中也可以自定义函数.使用函数可以提高编程效率. 1.函数 ...

  4. 两万字长文50+张趣图带你领悟网络编程的内功心法

    前言 我大学是学网络工程专业,也就是那种拉网线,面向网线编程的.依稀记得学习计算机网络这门课程的时候搭建的IT宅 itzhai.com个人网站. 算一下,学这门课程也已经快十年了. 某一天,偶然又看到 ...

  5. AlphaGo对战李世石谁能赢?两万字长文深挖围棋AI技术(二)

    编者按:李世石与Google Deepmind AlphaGo对战在即,围棋界和人工智能界对结果各有预测,但对于程序员来说,了解AlphaGo的技术路线可能更有意思.本文来自出门问问NLP工程师李理, ...

  6. 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)

    作者 l 程序员小跃 来源 l 程序员小跃(ID:runningdimple) 大家好,我是程序员小跃,一名在职场已经写了 6 年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的 ...

  7. 两万字长文总结,梳理 Java 入门进阶那些事(推荐收藏)

    大家好,我是程序员小跃,一名在职场已经写了6年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的Java后端架构,对Java还是相对了解的挺多. 大概是半年前吧,在知乎上有个知友私 ...

  8. 两万字长文总结,梳理 Java 入门进阶哪些事

    作者 l 程序员小跃 来源 l 程序员小跃(ID:runningdimple) 以下内容中的"小跃",并非指小生本人,而是原作者 大家好,我是程序员小跃,一名在职场已经写了6年程序 ...

  9. 两万字长文,彻底搞懂Kafka

    点击关注公众号,实用技术文章及时了解 1.为什么有消息系统 1.解耦合 2.异步处理 例如电商平台,秒杀活动. 一般流程会分为: 风险控制 库存锁定 生成订单 短信通知 更新数据 通过消息系统将秒杀活 ...

最新文章

  1. dockerfile php-fpm,1、使用dockerfile制作nginx+php-fpm镜像,实现lnmp。
  2. 【 FPGA 】设置输出延迟(Output Delay)
  3. 全球缺芯+瑞萨火灾——网络营销之下一众车企减产的减产,停产的停产
  4. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程
  5. 一个完整的Web应用程序部署示例
  6. Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
  7. 上海师范大学计算机作业网址,新SQL——SERVER实验练习答案.doc
  8. 谁才是2019最火爆的编程语言,看这篇就够了
  9. 你好,欢迎来到我的空间,
  10. 仿百度外卖的酷炫水波纹效果
  11. 华为:围绕价值创造展开人力资源管理
  12. 计算机考研哪个专业好就业,计算机专业考研选择哪个方向比较好就业?
  13. 为女性们点赞!Google 为女性提供更多支持
  14. html第四天网站首页的布局设计到实施
  15. MySQL慢查询配置和使用
  16. 无线传感器实验-低功率无线信道建模
  17. 谷歌浏览器打包扩展程序(记录扩展程序根目录)
  18. 互联网乱弹之毒在何方?
  19. TI CC3200 WIFI实训开发套件(OURS-SDK-WFB)IAR for ARM7.8调试2————对IAR for ARM的熟悉,并在开发板上跑起来第一个程序
  20. 沟通技巧-《说话的力量》书中的精髓:如何说话更有力量

热门文章

  1. stunnel安装及设置
  2. 干货-运行Python脚本的命令行操作(2)
  3. CISCO设备如何路由器模拟PC
  4. 微型计算机显卡,微型计算机编辑推荐显卡 XGI绘虹8300
  5. java 中海伦公式,java程序设计1-2之用海伦公式计算三角形的面积starring
  6. nodejs死亡笔记之CentOS7虚拟机的安装配置及nodejs的安装(面向Windows编程)
  7. 转:视频压缩的基本概念(x264解压包)
  8. phpcms mysql debug_phpcms教程之mysql配置优化
  9. 三菱FX3uPLC和安邦信变频器通讯程序
  10. 简单了解HTTP协议与HTTPS协议