一、为什么要学习设计模式?
1、提高设计和开发能力,不写烂代码
在软件开发中,“能跑起来” 只是基础,“能长期跑好、易迭代” 才是关键。
- 降低代码耦合度(减少模块间的依赖)
- 提高代码复用性(避免重复造轮子)
- 增强系统扩展性(应对需求变更时更灵活)
- 提升代码可读性(让团队协作更高效)
2、应付面试
在程序员的面试之中,常见的设计模式常常被问起(吐槽:比如单例模式的双重检查锁)
3、理解源码
Java的JDK源码、Spring、MyBatis等主流框架源码,还是其他优秀开源项目的源码,其内部大量运用了设计模式来优化架构、降低耦合
二、优质代码
- 可读性强:变量和函数名清晰,添加注释
- 高性能:考虑算法的时间和空间复杂度,避免不必要的资源浪费
- 遵循编程规范:命名规范(类名大驼峰、方法名小驼峰、常量全大写+下划线分割、包名小写+小数点分割)、代码格式规范
- 易于测试:遵循单一职责原则,每个类和方法应该只负责一个功能;易于编写可测试的代码
- 异常处理:在可能出现异常的进行捕获异常,并在适当的情况下记录错误信息和抛出新的异常
- 可复用性:将通用功能抽取成独立的工具类、模块、库,避免编写重复的代码
- 易于维护/可扩展性:在需求变更和功能新增的时候不必进行大规模改动
三、设计原则
SOLID KISS DRY 迪米特法则
1、单一职责(Single Responsibility Principle,简称SRP)
一个类或模块应该只负责一个特定的功能。这有助于降低类之间的耦合度,提高代码的可读性和可维护性。
避免设计大而全的类,避免将不相关的功能耦合在一起,来提高类的内聚性
2、开闭原则
软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”
在已有代码基础上扩展代码(新增模块、类、方法等)。而非修改已有代码(修改模块、类、方法等)
3、里氏替换原则
子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。
使用基类引用指针的函数必须能够在不知情的情况下使用派生类的对象。
4、接口隔离原则
客户端不应该强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。
核心是:将一个大的、通用的接口拆分成多个专用的接口。这样可以降低类之间的耦合度,为每个接口定义一个独立的职责。
5、依赖倒置原则
要依赖于抽象而不是具体实现
高层模块不应该依赖于低层模块,它们都应该依赖于抽象。
抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
6、KISS原则(Keep It Simple, Stupid)
KISS 原则:KISS 原则强调保持代码简单,易于理解和维护。
在编写代码时,避免使用复杂的逻辑、算法、技术;
##7、DRY原则(Don't Repeat Yourself)
避免代码重复,减少代码的冗余,提升代码的复用性和可维护性
8、迪米特法则
Principle of Least Knowledge(最少知识原则):一个对象应该尽量少地了解其他对象,降低对象之间的耦合度
两个类之间尽量不要直接依赖,如果必须依赖,最好只依赖必要的接口。
四、个人总结
在学习设计模式之中的一些体会
说到底,大部分人学习大部分设计模式和设计原则都是为了应付面试,在实际的工作之中应该进行适当的设计
过度设计会使得代码更加繁琐,完全不设计又会导致代码混乱,影响代码的可读性和可维护性;
比如在设计的时候,并不是将类的职责设计的越单一越好;接口的粒度和实际需求。过度拆分接口可能导致过多的单方法接口,这会增加代码的复杂性,降低可读性和可维护性。
单一职责和接口隔离原则的区别的粒度为分别为类和接口