代码人生

Java中的面向对象设计原则

代码人生 http://www.she9.com 2018-10-15 09:45 出处:网络 编辑:@技术狂热粉
Java中的面向对象设计原则

在本文中,我们将学习可应用于日常项目工作中的面向对象设计原则。学习面向对象编程的基础知识很重要,比如抽象、封装、多态性和继承。但是,与此同时,了解面向对象的设计原则,创建一个整洁的模块化设计同样重要。这些指导方针有助于设计强大的面向对象软件设计。


首先,让我们列出重要的面向对象设计原则,我们将更详细地讨论每个指导原则。

Java中的面向对象设计原则


封装变化


如果您知道您的代码将在未来发生更改,那么请将其分离出来。


这种OOP设计的好处是易于测试和维护适当封装的代码。


在软件领域只有一件事是不变的,那就是变化。因此,封装您希望或怀疑将来会更改的代码。


如果你用Java编程,那么遵循这样的原则:默认情况下,变量和方法都是私有的,并且增加访问,例如从私有到受保护而不是公共。Java中的一些设计模式使用封装。工厂设计模式是封装的一个示例,它封装了对象创建代码,并提供了在以后引入新产品而不影响现有代码的灵活性。

代码面向接口而不是实现


总是为接口编程,而不是为实现编程。这将导致一个灵活的代码,可以与任何新的接口实现一起工作。


在Java中使用变量的接口类型、方法的返回类型或方法的参数类型。许多Java程序员都建议这样做,包括像Effective Java和Head First design pattern这样的书。


委托原则

不要自己做所有的事情,把它委托给相应的类。委托设计原则的一个很好的例子是Java中的equals()和hashCode()方法。


为了比较两个对象是否相等,我们让类本身进行比较,而不是让客户机类进行检查。这种设计原则的好处是不重复代码,并且很容易修改行为。

开闭原则 (OCP)

类应该对扩展开放,对修改关闭。


类、方法或函数应该对扩展(新功能)开放,对修改关闭。


这种面向对象的设计原则的好处是防止程序员修改已经测试过的代码。

Dry —不要重复你自己

通过抽象常见的东西并将它们放在一个位置来避免重复的代码。


使用抽象类在一个地方抽象公共事物。如果您的代码块位于两个以上的位置,请考虑将其作为独立的方法,或者如果您多次使用硬编码值,请将其作为公共静态最终常量。


这种面向对象设计原则的好处在于维护。

单一职责原则 (SRP)

Web应用程序中的每个对象都应该有一个责任,所有对象的服务都应该集中于承担这个责任(SRP)。


如果您在Java中将多个功能放到一个类中,那么它将引入两个功能之间的耦合,即使您更改了一个功能,也有可能会破坏耦合功能,这需要进行另一轮测试,以避免对生产环境造成任何意外。

里氏替换原则(LSP)

里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

子类应该适合它们的基类。


根据Liskov替换原则,子类型必须可以替换超类型,即方法或函数,这些方法或函数使用超类类型来处理子类的对象,而不会产生任何问题。


LSP与单一责任原则和接口隔离原则密切相关。如果一个类比子类具有更多的功能,那么它可能不支持某些功能,并且违反LSP。

接口分离原则 (ISP)

接口分离原则指在设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。即,一个类要给多个客户使用,那么可以为每个客户创建一个接口,然后这个类实现所有的接口;而不要只创建一个接口,其中包含所有客户类需要的方法,然后这个类实现这个接口。

接口隔离原则表明,如果客户端不使用接口,就不应该实现接口。


这通常发生在一个接口包含多个功能,而客户端只需要一个功能而不需要其他功能时。接口设计是一项棘手的工作,因为一旦您释放了接口,您就不能在不破坏所有实现的情况下更改它。


这种设计原则在Java中的另一个好处是,接口有一个缺点,即在任何类都可以使用它之前实现所有的方法,所以只有一个功能意味着实现的方法更少。


依赖倒置原则定义

  • 高层模块不应该依赖低层模块,两者都应该依赖抽象

  • 抽象不应该依赖细节

  • 细节应该依赖抽象

不要要求依赖——它将由框架提供给您。这在Spring框架中得到了很好的实现。这种设计原则的美妙之处在于,DI框架注入的任何类都很容易用模拟对象进行测试,也更容易维护,因为对象创建代码集中在框架中,客户端代码不会被这些代码打乱。


实现依赖注入有多种方法,比如使用字节码工具,这是一些AOP(面向方面编程)框架(如AspectJ)所做的,或者使用代理,就像Spring中使用的那些。


请关注公众号:程序你好
0

精彩评论

暂无评论...
验证码 换一张
取 消