设计模式概念
设计模式是解决常见软件设计问题的经验总结,可以看成是一本代码设计宝典,帮助开发人员更好地完成软件设计工作。
分类
1)创建型
提供创建对象的机制,提升已有代码的灵活性和可复用性。
单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式、原型模式
2)结构型
介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
代理模式、桥接模式、装饰者模式、适配器模式、门面模式、组合模式、享元模式
3)行为型
负责对象间的高效沟通和职责传递委派
观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式
设计模式原则
1)单一职责原则
一个类只负责一项职责,这样可以使得类更加可维护、可扩展、可重用。
举例:比如说一辆汽车的刹车踏板,它的作用就是让行进间的汽车停止的,如果现在这个刹车踏板的功能改成了,踩一半是油门,踩到底是刹车,就违反了单一职责,会容易出事故。
单一职责原则优点:
1、提高代码的可读性和可维护性:一个类只负责一个职责,代码更加清晰,更
容易理解和维护。
2、降低类的复杂度:一个类只负责一个职责,类的复杂度更低,更容易进行测试和调式。
3、降低代码的耦合度:当一个类只负责一个职责时,不同的职责可以分配到不同的类中,不同的类之间相互独立,从而降低了代码的耦合度。
4、提高代码的可复用性:一个类只负责一个职责,可以更容易的被其他模块复用。
5、便于扩展和维护:当需求变化时,如果每个类只负责一个职责,我们只需要修改相关的类即可,不需要修改其他的类,从而更容易进行扩展和维护。
2)开放封闭原则
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,我们应该通过添加新的代码来扩展软件的功能,而不是修改已有代码。
举例:我还是用汽车举例, 我是一个广东人,今年冬天我要开车去东北去东北吃雪,因为广东人好吃嘛,没吃过雪 想去长白山吃点新鲜的雪。东北雪很大,就需要给这个车的轮胎做防滑。 其实很简单只要给轮胎装上防滑链就可以了,这就属于是对轮胎的开放扩充。 在轮胎上面新增了防滑链,没有改变轮胎的原有功能。我们不能因为为了给轮胎做防滑,而把汽车引擎换掉了。
3)里氏替换原则
子类必须能够替换掉它们的父类。也就是说,在任何使用父类的地方,都应该能够使用子类来替代,而且程序不应该出现任何错误或异常。
里氏替换原则和多态的区别:
1)定义不同:
多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。
里氏替换是一种设计原则,用来指导继承关系中子类该如何设计。
2)作用范围不同:
里氏替换原则适用于继承关系中的父类和子类之间的关系。
多态是面向对象编程的一种基本特性,可应用于所有面向对象编程的语言中。
3)使用目的不同:
里氏替换原则的主要目的是确保使用继承时,派生类可以替换基类,并保证代码的正确性和一致性。
多态的主要目的是增加代码的灵活性和可扩展性,同时减少重复代码。
4)接口隔离原则
客户端不应该依赖它不需要的接口。也就是说,我们应该将不同的接口拆分成更小的、更具体的接口,从而避免客户端依赖于他们不需要的方法。这样可以降低接口的复杂性,提高系统的可维护性和可扩展性。
接口隔离原则的优点:
1、提高代码的灵活性和可维护性:接口隔离原则要求我们定义精简的接口,这样可以使得代码更加灵活和可维护,因为我们只需要实现我们真正需要的接口即可。
2、提高代码的可测试性:接口隔离原则可以使得代码更加容易进行测试和调试,因为我们可以只测试我们真正需要的接口。
3、降低模块之间的耦合度:当模块之间只依赖于真正需要的接口时,它们之间的耦合度更低,更容易进行组合和修改。
4、提高代码的可复用性:当接口精简清晰时,代码的可复用性也会提高,因为
我们可以更容易地将代码组合到不同的应用场景中。
5、提高代码的安全性:接口隔离原则可以避免一些意外的依赖关系,从而提高
代码的安全性。
接口隔离原则和单一职责原则的区别:
1)单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
2)单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要是约束接口,主要针对抽象和程序整体框架的构建。
5)依赖倒置原则
高层模块不应该依赖底层模块,而是应该依赖于抽象。也就是说,我们应该面向接口编程,而不是面向实现编程。
依赖倒置原则的核心思想是:针对抽象编程,而不是针对具体实现编程。这样可以降低模块之间的耦合度,使系统更加灵活、可扩展和易于维护。同时,依赖倒置原则也可以促进面向对象设计的另一个原则——开闭原则的实现,即可以在不修改已有代码的情况下,通过添加新的实现来扩展系统的功能。
依赖倒置原则、依赖注入、控制反转三者的区别与联系
1)依赖倒置原则:是一种通用的软件设计原则,主要用来指导框架层面的设计。
2)控制反转:与依赖倒置有一些相似,它也是一种框架设计常用的模式,但并不是具体的方法。
3)依赖注入:是实现控制反转的一种手段,他是一种具体的编码技巧。
6)迪米特法则
一个对象应该对其他对象有最少的了解。也就是说,我们应该尽量减少对象之间的依赖关系,使得系统更加灵活、可扩展。
迪米特法则表达的思想:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。
7)合成复用原则
合成复用原则是一种面向对象设计中的设计原则,其核心思想是:尽可能使用对象组合和聚合,而不是继承来实现代码复用和灵活性。
在实现代码复用时,通常会考虑使用继承。然而,继承的局限性在于,它将子类于父类紧密耦合在一起,使得继承关系在设计时非常固定且难以修改,同时也增加了代码的复杂性。
相比之下,合成复用原则更加灵活。它通过将功能分解成更小的对象,将这些对象组合在一起来构建更复杂的对象,从而实现代码复用和灵活性。
聚合是指一个对象持有其他对象的引用,这些被持有的对象可以独立存在于整个系统中。
8)KISS原则
KISS原则是Keep It Simple And Stupid 的缩写,意思是”保持简单和愚蠢“。它是一种设计原则,通常用于软件开发和系统设计中。
KISS原则的核心思想:要尽可能地保持简单,避免过度复杂化和不必要的复杂性。它要求开发者尽可能地使用简单和易于理解地解决方案来解决问题,避免过度设计和过度工程化。