面向对象设计原则是OOPS编程的核心,但我见过的Java程序员大多热衷于Singleton(单例)、Decorator(装饰器)、Observer(观察者)和其他设计模式,没有足够重视学习面向对象的分析和设计。学习面向对象的编程基础知识,如“抽象”、“封装”、“多态”、“继承”很重要,但与此同时理解这些设计原则以创建简洁的模块化设计也同样重要。我经常看到不同经验水平的Java程序员,有的不了解这些OOPS和SOLID设计原则,有的只是不知道具体的设计原则会带来怎样的好处,甚至不知道如何在编码中使用这些设计原则。(设计原则)底线是始终追求高内聚低耦合的编码或设计。Apache和Sun的开源代码是学习Java和OOPS设计原则的好例子。它们向我们展示了如何在Java编程中使用设计原则。JavaJDK使用了一些设计原则:BorderFactory类中的工厂模式,Runtime类中的单例模式,java.io类中的装饰器模式。顺便说一句,如果您真的对Java编码原则感兴趣,请阅读JoshuaBloch撰写的EffectiveJava,他编写了JavaAPI。我个人最喜欢的面向对象设计模式是KathySierra的HeadFirstDesignPattern,以及其他面向对象的分析和设计。这些书在编写更好的代码、利用各种面向对象和SOLID设计模式方面大有帮助。虽然学习设计模式(原则)最好的方法是通过现实生活中的例子,了解违反设计原则的不便,但本文的目的是向那些没有接触过或正在接触的Java程序员介绍面向对象的设计原则。在学习阶段。.个人认为OOPS和SOLID设计原则需要在文章中明确介绍。我会在这里尽力做到这一点,但现在请准备浏览以下设计模式(原则)。DRY——不要重复自己***一个面向对象的设计原则是:DRY。从名字我们可以看出DRY(don'trepeatyourself)意思是不写重复的代码,而是将其抽象成可重用的代码块。如果你有两个以上相同的代码块,请考虑将它们抽象成一个方法;或者,如果您多次使用硬编码值,请将它们设置为公共常量。这种面向对象设计原则的优点是易于维护。重要的是不要滥用这个原则,重复不是为了代码,而是为了功能。它的意思是,如果您使用通用代码来验证OrderID和SSN,这并不意味着它们是相同的,或者它们将保持不变。通过为两个不同的功能使用公共代码,或者您已将两个不同的功能紧密联系在一起;当您的OrderID格式发生变化时,您的SSN验证码将失效。所以要提防这种耦合,不要将彼此无关的相似代码组合在一起。封装经常修改的代码软件世界中不变的是“变化”,因此封装您认为或怀疑将来会修改的代码。这种面向对象设计模式的优点是易于测试和维护适当封装的代码。如果您使用Java编程,请遵守以下原则:变量和方法的访问权限默认设置为private,逐渐释放它们的访问权限,例如从“private”到“protected”和“notpublic”.Java中的一些设计模式使用封装。工厂设计模式就是一个例子,它封装了创建对象的代码并提供了以下灵活性:后续生成新对象不会影响现有代码。开放/封闭设计原则OpenClosed设计原则类、方法/功能应该对扩展(新功能)开放,对修改关闭。这是另一个优雅的SOLID设计原则,可以防止有人修改通过测试的代码。理想情况下,如果您添加新功能,您的代码会被测试,这是开放/封闭设计原则的目标。顺便说一句,SOLID中的字母“O”指的是开/闭设计原则。SingleResponsibilityPrincipleSingleResponsibilityPrinciple(SRP)单一职责原则是另一个SOLID设计原则,SOLID中的字母“S”就是指代它。根据SRP,一个类应该仅出于一个原因进行修改,或者一个类应该始终实现一个功能。如果在Java中一个类中实现了多个函数,那么这些函数之间就存在耦合关系;如果你修改其中一个功能,你可能会打破这种耦合关系,然后再进行一轮测试,以避免出现新的问题。DependencyInjection/InversionPrincipleDependencyInjectionorInversionprinciple不要问框架的依赖注入功能会给你带来什么好处。spring框架已经很好的实现了依赖注入功能。这种设计原则的优雅之处在于:任何由DI框架注入的类都易于用mock对象进行测试,并且更易于维护,因为创建对象的代码集中在框架中,与客户端代码隔离。实现依赖注入的方式有很多种,比如使用字节码工具,其中有一些是AOP(面向切面编程)框架,比如spring中使用的pointcutexpression或者proxies。要了解有关此SOLID设计原则的更多信息,请参阅IOC和DI设计模式中的示例。SOLID中的字母“D”就是指这个设计原则。偏好组合而非继承偏好组合而非继承如果可能,偏好组合而非继承。你们中的一些人可能会反对这一点,但我发现组合比继承更灵活。组合允许在运行时通过设置属性来修改类的行为,类之间的组合关系利用多态性以接口的形式实现,为修改组合关系提供了灵活性。甚至EffectiveJava也建议优先使用组合而不是继承。LiskovSubstitutionPrincipleLSP根据LiskovSubstitutionPrinciple,父类出现的地方可以用子类代替。例如,用子类对象替换父类的方法或函数应该没有问题。LSP与单一职责原则和接口隔离原则密切相关。如果一个父类的功能比它的子类多,那么它可能不支持这个功能,也违反了LSP设计原则。为了遵循LSPSOLID设计原则,派生类或子类(与父类相比)必须增加功能,而不是减少功能。SOLID中的字母“L”指的是LSP设计原则。接口隔离原则接口隔离原则意味着如果你不需要一个接口的功能,那么就不要实现它。这主要发生在一个接口包含多个函数,但实现类只需要其中一个函数的情况下。接口设计是一项棘手的工作,因为接口一旦发布,您就无法在不影响实现它的类的情况下对其进行修改。Java中这种设计原则的另一个好处是,接口有一个特性,即接口的所有方法必须在任何类使用它之前实现,因此使用单功能接口意味着实现更少的方法。Programmingiscentraledontheinterface(ratherthantheimplementationobject)编程始终以接口(而不是实现对象)为中心,这使得代码的结构灵活,任何新的接口实现对象都可以兼容现有代码结构。因此,在Java中,变量、方法返回值、方法参数的数据类型请使用接口。这是许多Java程序员推荐的,EffectiveJava和headfirstdesignpattern等书籍也是如此。代理原则不要指望一个类完成所有的功能,可以适当的把一些功能交给代理类来实现。代理原则的好例子是:Java中的equals()和hashCode()方法。为了比较两个对象的内容,我们让用于比较的类自己而不是调用者进行比较。这种设计原则的好处是没有重复编码,很容易修改类的行为。总结以上所有面向对象的设计原则,可以帮助你写出灵活优雅的代码:一种高内聚低耦合的代码结构。理论只是第一步,更重要的是我们必须具备发现何时使用这些设计原则的能力。要找出我们有没有违反什么设计原则,影响代码的灵活性,但是世界上没有完美的东西。我们在解决问题的时候不能总是使用设计模式和设计原则。它们中的大多数用于长期维护。大型企业项目的周期。
