博客
关于我
设计模式的六大原则
阅读量:514 次
发布时间:2019-03-07

本文共 1729 字,大约阅读时间需要 5 分钟。

前言

最近感觉自己越发无知,学习不能停,写博客仍然是我觉得一个好的总结与检验学习成果的一个好方法,准备花功夫继续更新下去了。最近学习计划是设计模式,希望和大家多多交流,有错误的地方请不吝赐教,期待和你共同进步。

设计模式的准则有哪些?

  • 单一原则(Single Responsibility Principle)
  • 开闭原则 (Open Closed Principle)
  • 里氏替换原则 (Liskov Substitution Principle)
  • 迪米特原则 (Law of Demeter)
  • 接口隔离原则 (Interface Segregation Principle)
  • 依赖倒置原则 (Dependence Inversion Principle)

单一原则

就是一个类只能做一件事。

我所理解的就是如果这个类是用来计算优惠的类,那怎么添加商品就不该放在这个类中。

开闭原则

开闭是指对扩展开放,对修改关闭。

我之前看到的一篇博客,感觉对这个事情解释的比较清楚,他说开闭原则更像是其他五个准则的衡量标准,前面写好的,就自然很符合开闭原则

里氏替换原则

为什么叫里氏替换原则,是因为这个理论是由Barbara Liskov女士在1987年针对“我们该如何度量继承关系的质量”这一问题提出的一个原则。

“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”

换成大白话讲,任何使用父类实例的地方,可以用子类实例替换,它们之间才具有良好的继承关系。

为了实现这个原则,需要满足以下几点:

  1. 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。(很显然,设计者如果需要继承就会设计成抽象方法,没有设计成抽象方法是想不希望被修改的。)
  2. 子类中可以新增方法。(这个是允许的,子类允许拥有这个自由。)
  3. 当子类的方法重载父类的抽象方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。(例如父类抽象方法要求入参是个List ,子类如果改成 ArrayList,那么传递 LinkedList 参数的方法在父类可以正常使用,替换成子类就会报错。)
  4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。 例如父类返回的是ArrayList,子类如果是List,虽然不会报错,但是会破坏父类的约束条件。

这里我当初有个问题:子类应该比父类设计的宽松,那么返回值为什么要比父类严格,比他宽松不就好了吗?如果这是破坏约束,那么入参宽松就不算破坏了吗?

后来给自己的答案是:

  1. 如果重写方法,子类不要破坏父类的约束,这个方面IDE会直接编译报错。
  2. 重载方法父类方法,可以修改,但是要遵守以上的规则。

迪米特法则

迪米特法则还有另外一个名字,就是最少知道原则。意思是隐藏多余的细节,只提供给使用方应该知道的内容,减少认知成本和不必要的错误使用。

接口隔离原则

这里的接口是代指接口和抽象类,并非是单纯的接口。这个原则的含义有两个:

  • 尽量小的接口设计。
  • 使用方不应该依赖不需要的接口。

这个原则的本质是想对一个职责的方法做更为细致的划分,这样的做的好处是具有更好的封装性。

依赖倒置原则

这个原则是高层模块与底层模块之间的纠葛,是抽象与细节之间的缠绕,总结起来是

  • 高层模块不应该依赖底层模块,两者都应该依赖其抽象。
  • 抽象不能依赖细节
  • 细节应该依赖于抽象

换成大白话,两个模块之间的通信,不建议直接调用,应该使用接口或抽象类,这样可以降低耦合,更加通用。你走他来,只要通信接口不变,相互之间就没有感知,面向接口编程。

原则之间的联系

以上是我对这些设计原则的理解。虽然理论知识是基本理解了,但是在实际工作中的运用,因为业务的复杂度,有些原则不能全面兼顾,还是需要多加斟酌和取舍。

愿我们在现实中多做尝试,不要只是纸上谈兵,加油,下篇博客见。


欢迎关注个人微信公众号,最新的博客,好玩的事情,都会在上面分享,期待与你共同成长。

在这里插入图片描述

转载地址:http://yerjz.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
【Flink】Flink 1.9 版本 web UI 突然没有日志
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>