设计模式就是软件设计中沉淀出的一些代码设计经验,设计模式主要是基于OOP角度来总结的。
软件设计原则的目的是 代码复用性、代码可扩展性、代码可维护性。
常见的软件设计原则分为:单一职责、开闭原则、接口隔离、里式替换、迪米特原则、依赖倒置原则。
一个类或者方法只有一个职责,只有一个引起它变化的原因。
如果一个类有2个以上的职责,这些职责就耦合在一起了,会导致其中一个变化时,会影响到其他责任。多个职责耦合在一起,会影响代码复用性、对测试不友好。
开闭原则就是说对扩展开放,对修改关闭。
在程序需要进行拓展的时候,尽量不去修改原有的代码,实现一个热插拔的效果。一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,通过实现类达到扩展需求。
里氏代换原则(Liskov Substitution Principle LSP)是面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。也就是说一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。
日常开发工作中,使用上述设计原则虽然不能保证写出完美的系统,但是可以保证系统实现不会差,基本的扩展性可维护性还是能够满足的。如果有些场景下,不能严格按照软件设计原则来实现,起码的隔离性要求还是要满足的,这样才能保证在后续修改时控制影响面,避免改动牵一发而动全身。