首页 > 代码库 > 设计模式六大原则
设计模式六大原则
设计模式的使用,增加了代码的可维护性、可扩展性、可复用性和灵活性,而设计模式的六大原则为知道方针,也是设计模式的核心。
设计模式中常用的六大原则为:
一、单一职责原则(Single Responsibility Principle,SRP)
定义:一个对象应该只包含单一职责,并且该这则被完整的封装在一个类当中。确切的解释是,就一个类而言,应该仅有一个引起它变化的原因。
分析:
一个类承担的职责越多,它被复用的可能性就越小;如果一个类职责过多,就会把这些职责耦合在一起,如果其中一个职责发生改变,就有可能影响其他职责的运作。
单一职责原则是实现高内聚,低耦合的指导方针,在代码重构中应用广泛,是最简单也是最难运行的原则。
优点:降低类的复杂性,类的职责清晰明确;提高类的可读性和可维护性。
二、开放-封闭原则(Open-Closed Principle,OCP)
定义:软件实体(类、模块、函数等)可以扩展,不可以修改。实现开闭原则的关键是抽象化。
分析:
软件应该具有一定的适应性和灵活性。当软件实体需求变化时,尽量通过扩展已有软件实体实现新的行为,而不是修改已有的代码。
实现开闭原则的关键是抽象化,开发人员应该仅对程序中呈现出频繁变化的那些部分作出抽象,然而,对于应用程序中的每个部分都可以的进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身同样重要。
三、依赖倒转原则(Dependence Inversion Principle,DIP)
定义:抽象不应该依赖细节,细节应该依赖于抽象,也就是说,要针对接口编程,不要对实现编程。依赖倒转原则可表述为:
1)高层模块不应该依赖底层模块。两个都应该依赖抽象。
2)抽象不应该依赖细节。细节应该依赖抽象。
分析:
依赖倒转原则是实现“开放-关闭原则”的手段,如果想到达到最好的“开闭”原则,就要尽量遵守依赖倒转原则,可以说,依赖倒转原则是对“抽象化”的最好规范。
四、里氏代换原则(Linkov Substitution Principle,LSP)
定义:子类型必须能够替换掉它们的父类型。也就是说,一个软件使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。在软件里,把父类都替换成它的子类,程序的行为没有变化。
分析:
里氏代换原则是实现开闭原则的重要方式之一,由于使用父类对象的地方都可以使用子类对象,在程序中尽量使用父类类型对对象进行定义,而在运行时再确定子类类型,用子类对象来替换父类对象。
五、迪米特法则(Law of Demeter,LoD)
定义:在类的结构设计上,每一个类都应该尽量降低成员的访问权限。如果两个类不必直接通信,那么这两个类就不应该发生直接作用。而是通过引入一个第三者发生简单交互。
分析:
迪米特法则的核心是松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关的类造成波及。
六、合成/聚合复用原则(Composite/Aggrega Reuse Principle,CARP)
定义:尽量使用合成/聚合,尽量不要使用继承。
分析:
聚合表示一种强的”拥有“关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。
合成则是一种强的”拥有“关系,体现了严格的部分和整体关系,部分和整体的声明周相同。一旦整体对象不存在了,部分对象也将不存在,部分对象与整体对象之间有同生共死的关系。
这一原则和里氏代换原则是相辅相成的,两者都是实现”开-闭“原则的规范,违反这一原则,”开-闭“原则也将无法实现。
优先私用此原则,有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持小规模,并且不太可能增长为不可控制的庞然大物。所以,我们在设计中,尽量不要使用类继承,而是使用合成/聚合。