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

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

前言

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

设计模式的准则有哪些?

以下是设计模式的七个核心准则:

  • 单一原则
  • 开闭原则
  • 里氏替换原则
  • 迪米特原则
  • 接口隔离原则
  • 依赖倒置原则

单一原则

单一原则的核心思想是:一个类应该只承担一项任务。例如,如果一个类专门用于计算优惠,那么这个类中的方法应该与优惠计算相关,完全不应该涉及商品的添加或修正。

开闭原则

开闭原则强调对扩展开放,对修改关闭。这意味着当系统需要增加功能时,可以通过扩展而不是修改现有代码来实现;而当需要修改现有代码时,不会对已经实现的功能产生影响。如果我们已经有一段代码,并且这段代码符合开闭原则,那么它也很容易满足其他五个准则的要求。

里氏替换原则

里氏替换原则的名称来源于Barbara Liskov女士提出的一个问题:如何度量继承关系的质量。它的核心思想是:用子类实例替换父类实例时,任何关于父类的性质都应该在子类中成立。这意味着子类不能破坏父类的行为和约束条件。

为了实现里氏替换原则,子类必须满足以下条件:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  • 子类可以新增方法。
  • 当子类重载父类的抽象方法时,方法的参数必须比父类更宽松。
  • 当子类实现父类的抽象方法时,方法的返回值必须比父类更严格。
  • 例如,如果父类定义了一个返回ArrayList的方法,那么子类只能返回更具体的集合类型,比如List。否则,父类的方法将无法正常工作。

    关于里氏替换的理解,有一点需要注意:虽然父类和子类的参数可能更宽松,但返回值必须更严格。这是因为方法的约束条件由返回值来决定。如果方法返回的类型宽松化,可能会导致约束被打破。例如,父类方法返回List,子类方法返回Collection虽然看起来更灵活,但实际上可能会允许不符合父类预期的元素类型,从而破坏约束条件。

    迪米特法则

    迪米特法则,也被称为“最少知道原则”,主要是建议在类之间施行细节屏蔽,也就是只向需要的对象暴露必要的信息。这样可以不让其他模块对内部的具体实现产生过多的耦合关系,从而降低耦合度。

    接口隔离原则

    接口隔离原则的意思是:不要让一个接口承担多于一个职责,每个接口应该只提供与其关联的功能。这个原则可以帮助我们在设计接口时更加细致划分职责,从而提高代码的可维护性和可扩展性。

    接口隔离原则可以从以下两个方面来理解:

  • 实际上,任何类都可以看作一个接口。如果一个类实现了多个接口,那么这些接口之间是否需要互相关联?答案是:它们之间是完全不相关的。所以,一个接口应该只做它自己的事情,不需要被别的接口依赖。

  • 接口隔离原则强调的是依赖关系的透明度和避免不必要的绑定。

  • 通过接口隔离原则,系统可以更加灵活地变化。例如,如果我们需要修改某个接口的实现,系统只需要修改实现该接口的类,而不需要修改所有使用该接口的类。

    依赖倒置原则

    依赖倒置原则(Dependence Inversion Principle)主要是为了避免高层模块对低层模块的直接依赖,从而降低耦合度。具体来说,它的核心思想是:高层模块不应该直接依赖底层模块,而是应该通过抽象来进行通信。

    依赖倒置原则可以更具体地表述为:

    • 抽象类和接口应该不直接依赖具体的实现类。
    • 具体实现类应该依赖抽象类或接口。

    这个原则的本质是让模块之间的通信更加灵活,不会直接受具体实现的影响。例如,如果我们有一个支付系统,客户端不应该直接依赖于某个传输层的实现类,而是应该依赖于一个支付接口,这样客户端可以使用不同的传输实现而无需做任何修改。

    原则之间的联系

    虽然了解了解这些原则很有帮助,但是在实际工作中,可能需要根据具体的场景做取舍。某些情况下,可能需要放松某些原则,因为业务需求或技术限制使得完全遵守所有原则变得不现实。关键在于理解每个原则的核心思想,并在实际应用中灵活运用。

    未来,我会继续深入理解和实践这些设计模式,也会更关注它们之间的相互关系和实际应用中的权衡。感谢你的关注,期待能和你一起不断进步。

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

    你可能感兴趣的文章
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>