设计模式-6大设计原则

单一职责原则(SRP:Single Responsibility Principle)

定义:应该有且仅有一个原因引起类的变更。

优点

  • 类的复杂性降低;
  • 可读性提高;
  • 可维护性提高;
  • 变更引起的风险降低。

建议:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

里氏替换原则(LSP:Liskov Substitution Principle)

定义:所有引用基类的地方必须能透明地使用其子类对象。

四层含义

  • 子类必须完全实现父类的方法
  • 子类可以有自己的个性
  • 覆盖或实现父类的方法时输入参数可以被放大(子类参数是父类参数的基类)注:使用此规则重载父类函数,避免替换后调用子类方法,而不符合用户预期
  • 覆盖或实现父类的方法时输出参数可以被缩小(子类返回值是父类返回值的派生类)注:参数列表相同时使用此规则构成重写,符合预期;不同时构成重载,同上

建议

类中调用其他类时,务必使用父类或接口;否则说明违背了此原则。

若子类不能完整地实现父类的方法,则建议断开父子继承关系,采用依赖、聚集、组合等关系替代继承。

依赖倒置原则(DIP:Dependence Inversion Principle)

三层含义

  • 模块间的依赖通过抽象产生,实现类之间不发生依赖关系,其依赖是通过接口或抽象类产生的;
  • 接口或抽象类不依赖于实现类;
  • 实现类依赖接口或抽象类。

简而言之:面向接口编程

抽象是对实现的约束,对依赖者而言,也是一种契约,目的是保证所有细节不脱离契约的范畴。

依赖的三种写法

  1. 构造函数传递依赖对象(构造函数注入)
  2. Setter方法传递依赖对象(Setter依赖注入)
  3. 接口声明依赖对象(接口注入)

建议

  • 每个类尽量有接口或抽象类
  • 变量的表面类型尽量是接口或抽象类
  • 任何类都不应该从具体类派生
  • 尽量不要覆写基类的方法
  • 结合里氏替换原则使用

关于【倒置】:

“正置”:面向实现编程,开车依赖车,使用电脑依赖电脑。

根据系统设计的需要产生了抽象间的依赖,替代了人们传统思维中事务间的依赖,“倒置”就是从这里产生的。

接口隔离原则(Interface Segregation Principle, ISP)

 定义:客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。(接口尽量细化,同时接口中的方法尽量少。)

四层含义

  • 接口要尽量小:根据接口隔离原则拆分接口时,首先必须满足单一职责原则。
  • 接口要高内聚:减少对外的交互,尽量少公布public方法。
  • 定制服务:只提供访问者需要的方法
  • 接口设计是有限度的:接口设计注意适度,控制粒度与复杂度的平衡

迪米特法则(Law of Demeter,LoD/Least Knowledge Principle,LKP)

 定义:一个对象应该对其他对象有最少的了解。

四层含义

  • 只和朋友交流:耦合的关系-组合、聚合、依赖等(方法实现时尽量不引入一个类中不存在的对象)
  • 朋友间也是有距离的:合理运用封装性,封装过度细化的接口作为public方法暴露给朋友
  • 是自己的就是自己的:如果一个方法可以放在本类中,既不增加类间关系,也不对本类产生负面影响,那就放在本类中。
  • 谨慎使用Serializable(序列化)

核心

类间解耦,弱耦合。但过度使用会产生大量中转或跳转类,需反复权衡找到平衡点,跳转次数尽量控制在两次以内。

开闭原则(Open Closed Principle, OCP)

 定义:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。

优点

  • 提高复用性
  • 提高可维护性
  • 面向对象开发的要求

如何使用

  1. 抽象约束:不允许出现抽象类中不存在的public方法;参数类型、引用对象尽量使用抽象类,而不是实现类;抽象层尽量保持稳定。
  2. 元数据控制模块行为:从文件或数据库中获取元数据
  3. 制定项目章程
  4. 封装变化:将相同的变化封装到一个抽象类中;将不同的变化封装到不同的抽象类中。

总结

SRP:单一职责原则

OCP:开闭原则

LSP:里氏替换原则

LoD:迪米特法则

ISP:接口隔离原则

DIP:依赖倒置原则

将六大原则首字母链接,就是SOLID(稳定的),建立稳定、灵活、健壮的设计,开闭原则是其他5大原则的精神领袖。

开闭原则是一个终极目标,任何人都无法百分百做到,我们只是尽量去朝这个目标去做,实际工作时也要结合具体情况。

参考文献:《设计模式之禅》--秦小波

(0)

相关推荐

  • "设计模式我学过呀,就是没用过"

    回复"000"获取大量电子书 写在前面 在开发中,不使用设计模式也不是不可以,但是用好设计模式能帮忙我们更好的去解决实际问题. 其实,我们天天都在和设计模式打交道,很多人却完全不知 ...

  • 面向对象设计的原则

    开放封闭原则(The Open Closed Principle) ** 一个软件实体如类.模块和函数应该对扩展开放,对修改代码关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展** [===== ...

  • 设计模式(Design Patterns)的简单讲解

    模式的诞生与定义 模式(Pattern)起源于建筑业而非软件业(小本本记下来--) 模式之父--美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士; 模式 : -C ...

  • 设计模式-七大软件设计原则

    设计模式 参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好的设计模式 http://c.biancheng.net/view/1326.html 基本原则 开闭原则 在设计的 ...

  • 【资料】23种设计模式和六大设计原则

    程序IT圈 www.cxyquan.com 优秀的程序猿技术公众号 1 设计模式的六大原则 ☛开闭原则 对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简 ...

  • 深入浅出详解软件开发中的 6 大设计原则

    在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义.本文主要将总结这些常见的原则,和具体阐述意义. 开发原则 面向对象的基本原则 ...

  • 无水炮泥常用原料明细及无水炮泥4大设计原则

    为了使铁口工作状态稳定,满足高炉强化冶炼的需要,要求炮泥的作业性.体积稳定性.烧结性和开口性能要好,同时具有抗渣,铁液侵蚀和冲刷,抗氧化的特性.炮泥按所用结合剂通常可以分为有水泡泥和无水炮泥. 生产炮 ...

  • 国有科技型企业薪酬管理:需把握3大设计原则,5大优化要点

    在人力资源的管理中,薪酬管理扮演着重要的激励角色,需要同时具有科学性和公平性,才能对激发企业员工的积极性和主动性起到理想的作用.国有科技型企业因为它本身兼具国有企业和科技企业的多重特殊性,国家相关的政 ...

  • 干货 | 优秀架构师必须了解的6大方面30条设计原则

    Java进阶架构师2019-11-29 06:16:49 架构的话题,之前就讲过许多,比如: 对呀,我就是认定架构师都是不干活,只会画PPT的! 好文 | 架构师更多的是和人打交道,说说我见到和听说到 ...

  • 重温设计模式系列(三)面向对象设计原则

    背景 面向对象基础知识,只是给了我们一个概念,如何更好的设计出良好的面向对象代码,需要有设计原则作为支持.设计原则是核心指导思想,在这些原则的基础上,经过不断的实践,抽象,提炼逐步产生了针对特定问题的 ...

  • 设计模式6大原则详解

    设计模式六大原则: 面向对象语言开发过程中,推荐的一些指导性原则(并不是强制要求的) 1. 单一职责原则(Single Responsibility Principle) 2. 里氏替换原则(Lisk ...

  • 【设计模式】设计原则--面向接口编程你理解的对吗?

    最近看了<Head First Design Patterns>这本书.正如其名,这本书讲的是设计模式(Design Patterns),而这本书的第一章,讲的是很重要的一些设计原则(De ...