2020年12月4日星期五

设计模式-6大设计原则

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大原则的精神领袖。

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

 

 

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









原文转载:http://www.shaoqun.com/a/494835.html

首信易:https://www.ikjzd.com/w/1841

万国邮政联盟:https://www.ikjzd.com/w/861

铭宣海淘:https://www.ikjzd.com/w/1551


6大设计原则简单总结单一职责原则(SRP:SingleResponsibilityPrinciple)定义:应该有且仅有一个原因引起类的变更。优点:类的复杂性降低;可读性提高;可维护性提高;变更引起的风险降低。建议:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。里氏替换原则(LSP:LiskovSubstitutionPrinciple)定义:所有引用基类的地方必须能透明地使用其子
livingsocial:livingsocial
olive:olive
USPTO:USPTO
降低退款率!Wish瑞典路向物流最新解决方案:降低退款率!Wish瑞典路向物流最新解决方案
珠海有什么地方比较好玩的?:珠海有什么地方比较好玩的?

没有评论:

发表评论