Java设计模式中的七大原则详细讲解
1. 单一职责原则
单一职责原则(Single Responsibility Principle,SRP)指的是一个类或者模块只负责完成一个职责或功能。如果一个类职责过多可能导致其难以维护,因此需要将其拆分成多个类。
例如,我们有一个 User
类,其职责包括用户登录和注册,查看用户信息等。如果我们将用户登录和注册另外封装成一个 Auth
类,那么 User
类就只需要负责处理查看用户信息这个职责,代码会更加清晰易懂。
2. 开闭原则
开闭原则(Open-Closed Principle,OCP)指的是一个软件实体应该对扩展开放,对修改关闭。也就是说,在不修改原有代码的前提下,能够扩展新的功能。这样可以提高程序的复用性和可维护性。
例如,我们有一个 Animal
类,其具有类似于 run()
、sleep()
等方法。现在我们需要扩展一些新的行为,比如 fly()
,我们可以采用继承的方式,在原有代码基础上新增一个 Bird
类,并实现 fly()
方法,这样就实现了对扩展开发,对修改关闭。
3. 里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是基于面向对象设计基本特征之一——继承而引入的。它指出,如果一个程序使用的是父类对象的话,那么一定可以使用其子类来进行替换,而不会影响程序的正确性。
例如,我们有一个抽象的 Shape
类,其有一个计算面积的方法。现在我们在这个基础上分别拓展出了 Triangle
和 Rectangle
类,并分别实现了计算自己面积的方法。此时,我们可以将 Triangle
和 Rectangle
对象作为 Shape
对象使用,以便进行统一的处理。
4. 接口隔离原则
接口隔离原则(Interface Segregation Principle,ISP)指的是多个客户端不应该依赖着他们不需要的接口。这主要是为了避免类的接口过于臃肿而不好维护,同时也可以避免各种与实际需求不符的问题。
例如,我们有一个 Calculator
接口,其中定义了基本的 add()
、subtract()
等方法。如果客户端仅仅需要使用 add()
方法,那么我们可以将其定义为单独的 Adder
接口,避免客户端依赖接口过于臃肿。
5. 依赖倒置原则
依赖倒置原则(Dependency Inversion Principle,DIP)是指高层模块不应该依赖底层模块,而是应该依赖其抽象。同时,抽象不应该依赖细节,细节应该依赖抽象。
例如,我们有一个 Database
类,其提供数据库的增删改查一系列方法。如果我们在主程序中直接调用这些方法,那么主程序将会与 Database
类产生强耦合,而且会导致代码难以维护和修改。相反,我们可以定义一个 IDatabase
接口,主程序通过该接口与 Database
类产生关联,这样就能使得主程序的修改对 Database
类的修改产生最小影响。
6. 迪米特法则
迪米特法则(Law of Demeter,LOD)又称最小知识原则(Least Knowledge Principle,LKP),是指一个对象应该对其他对象有尽可能少的了解。也就是说,与其他对象的交互应该尽可能地限制在最小化的范围内。这样可以降低对象之间的耦合度,从而提高软件系统的稳定性和可维护性。
例如,我们有一个 Car
类,其内部需要包含 Engine
、Wheel
、Light
等多个零件。如果我们在 Car
类中直接调用这些零件的方法,那么将会导致代码的瘤背软,难以扩展和维护。相反,我们可以在 Car
类中仅包含这些零件的引用,在需要调用相关零件的方法时,以参数的方式引入,就能践行最小化知识原则,降低对象间的耦合。
7. 合成复用原则
合成复用原则(Composite Reuse Principle,CRP)是指在设计时应当优先使用对象组合,而不是继承。通过使用对象组合,可以灵活的对象的功能,并且可以避免继承所带来的紧耦合关系。
例如,我们有一个 Person
类,其中包含 Head
、Arm
和 Leg
等多个部件。如果我们采用继承的方式来拓展 Man
和 Woman
类,那么就会导致代码的耦合度太高。相反,我们可以采用对象组合的方式,将 Head
、Arm
和 Leg
等部件定义为对象,并在 Person
中引用这些对象,这样就可以灵活地拓展 Man
和 Woman
类了。
以上七大原则,是实际编程中必须遵守的基本规则,能够提高代码的质量和可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式中的七大原则详细讲解 - Python技术站