设计模式 六大原则
定义一个方法、一个类只负责一个职责,各个职责的程序改动。不影响其他程序。目的降低类和类的耦合,提高可读性,增加可维护性和可扩展性,降低可变性的风险。
设计模式六大原则
分类
单一职责原则(Single Responsibility Principle)
定义
一个方法只负责一件事
一个方法、一个类只负责一个职责,各个职责的程序改动。不影响其他程序。
目的
降低类和类的耦合,提高可读性,增加可维护性和可扩展性,降低可变性的风险。
开闭原则 (Open Closed Principle)
定义
一个软件的实体应该对扩展开放,对修改关闭。
也就是说设计一个模块的时候,应当使这个模块可以在不被修改的情况下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
目的
提高软件的可维护性、可扩展性和可重用性,同时降低软件的复杂性和风险。遵循开闭原则可以使软件更容易应对变化和需求的不断演化,同时也可以减少程序员的工作量和出错率。
实现的方式
- 抽象和多态
- 模版方法
- 策略模式
- 观察者模式
参考
里氏替换原则 (Liskov Substitution principle)
定义
使用的基类可以在任何地方使用继承的子类,完美的替换基类。
子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类可以增加自己特有的方法。
作用
增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响。
依赖倒置原则(Dependency Inversion Principle, DIP)
定义
-
高层模块不应依赖于低层模块,两者都应该依赖于抽象。
高层模块通常指的是应用程序中更接近业务逻辑的组件,而低层模块则是指那些实现具体功能的组件。这个原则强调的是,高层模块在设计时应该依赖于抽象接口或抽象类,而不是依赖于具体的实现类。
-
抽象不应依赖于细节,细节应依赖于抽象。
这意味着在设计系统中,抽象层应该定义系统的运作方式,而具体实现则应该遵循这些抽象定义。这样,当具体的实现需要改变时,只要它们仍然符合抽象层的规定,系统的其他部分就不需要修改。
作用
- 解耦:通过依赖抽象而不是具体实现,可以减少不同模块之间的耦合度。
- 灵活性:系统更容易扩展,因为新的实现可以很容易地被插入到系统中,只要它们遵循相同的抽象接口。
- 可测试性:由于抽象和实现被分离,可以更容易地为系统编写单元测试。
接口隔离原则(Interface Segregation Principle, ISP)
定义
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。这意味着一个类不应该被强制实现一个它不使用的接口的所有方法。
作用
- 降低耦合度:通过定义更小的、特定的接口,可以减少类之间的依赖关系,从而降低耦合度。
- 提高灵活性:当系统需要变化时,可以实现只对特定的接口进行修改,而不会影响到其他部分。
- 增强可维护性:较小的接口更容易理解和实现,有助于提高代码的可维护性。
- 促进重用:定义更小的接口可以使得它们更容易被重用在不同的场景中。
迪米特法则**(Law of Demeter, LoD)**
定义
又称为最少知识原则(Principle of Least Knowledge)
- 一个对象应该对其他对象有最少的了解
- 每个单元(类,模块等)应该只与它的直接朋友通信。
直接朋友:
- 当前对象本身
- 以参数的形式传入对象的方法的对象
- 当前对象创建的对象
- 当前对象的成员对象
- 对象的成员对象创建的对象
作用
- 降低耦合度: 通过限制对象间的交互,可以减少他们之间的耦合度,使得系统更加模块化
- 提高可维护性:当系统中的一个部分发生变化时,其他部分不受影响,这有助于提高系统的可维护性。
- 增强封装性:迪米特法则鼓励封装对象的内部结构,只暴露必要的接口,这有助于保护对象的内部状态。
- 提高可读性:遵循迪米特法则的代码通常更加清晰和易于理解。
少用继承多用组合(合成复用)
定义
“少用继承多用组合(合成复用)”是面向对象设计中的一条重要原则,它强调在设计类和对象时,应优先考虑使用对象组合来实现功能,而不是通过继承来扩展功能。这个原则有助于创建更加灵活、可维护的软件系统。
作用
- 提高灵活性: 组合可以提供更大的灵活性,因为它允许在运行时动态地更改对象的组合。
- 降低耦合度:继承会创建强耦合,因为基类的变化可能会影响所有派生类。组合则可以减少这种耦合。
- 提高可维护性:使用组合可以使代码更容易理解和维护,因为每个类只关注自己的职责。
- 避免基类问题:在继承中,基类的实现细节可能会泄露给派生类,而组合则可以更好地封装这些细节。
- 促进重用:组合允许更细粒度的重用,因为不同的类可以组合相同的对象来实现不同的功能。
参考文章:
更多推荐
所有评论(0)