带你快速记忆设计模式的七大原则

434 阅读5分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

带你快速记忆设计模式的七大原则

设计模式导论

什么是GOF

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

在1994年,由Erich Gamma、Richard Helm、Ralph Johnson和JohnVlissides四人合著出版了一本名为Design Patterns-Elements of ReusableObject-Oriented Software(中文译名:设计模式-可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。

该书中主要提到两个观点

  • 对接口编程而不是对实现编程

  • 优先使用对象组合而不是继承

设计模式解决的问题

对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。

设计模式的的七大原则(SOLID)

开闭原则(Open Closed Principle,OCP)

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。

软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类

如果有一个A类、B类,A类需要新增一个功能,那么可以通过新添加一个B类来来继承A类的原功能,并在B类上完成新增功能。

总结一句话如果需要添加功能,那么扩展新类来实现新增功能的实现而不是修改旧类的方法

开闭原则是面向对象编程中,最核心最基础的一个原则。所有的设计模式都是围绕着这一原则去实践。

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

继承必须确保超类所拥有的性质在子类中仍然成立

里氏替换原则是继承复用的基石,只有当子类可以替换超类,软件单位的功能不受到影响时,超类才能真正被复用,而子类也能够超基类的基础上增加新的行为。

里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

总结一句话子类应该继承父类而不去改变父类

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

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象

比如上层接口A和B,实现类是A1和B1,如果在实现类A1中需要使用B的方法,则依赖与B的接口,而不是B接口的实现。

总结一句话面向接口编程,而不是面向实现类

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

一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分

每个类都只需要管理自己属于的自己的功能,通过各个类的组成一个超级的大类来完成多个方法,而不需要一个类完成多个功能。

总结一句话每个类只负责自己的事情,而不是变成万能

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

客户端不应该依赖他不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上

总结一句话各个类建立自己的专用接口,而不是建立万能接口

迪米特法则(Law of Demeter,LoD)

最少知识原则

只与你的直接朋友交谈,不跟“陌生人”说话

一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

总结一句话无需直接交互的两个类,如果需要交互,使用中间者

注意事项过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低

合成复用原则(Composite Reuse Principle,CRP)

又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)

软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

合成或聚合可以将已有对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能。

总结一句话优先组合,其次继承