面向对象设计原则为支持可维护性,可复用性而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。
面向对象七大原则
一、开闭原则(Open-Closed Principle,OCP)
开闭原则是总纲、最基本原则。
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
为了满足开闭原则,需要系统对类进行抽象化设计,抽象化是开闭原则的关键。可为系统定义一个相对稳定的抽象层,将不同的实现移至具体的实现层完成。
注意:
因xml和properties等格式的配置文件是纯文本文件,可直接通过VI编辑器或记事本进行编辑,且无须编译,因此在软件开发中,一般不把对配置文件的修改认为是对系统源码的修改。如果一个系统在扩展时只涉及到配置文件的修改,而原有的Java代码没有变动,该系统即可被认为是一个符合开闭原则的系统。
二、单一职责原则(Single Responsibility Principle, SRP)
类如何定义。它用于控制类的粒度大小。
一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又是最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践能力。
三、里氏替换原则(Liskov Substitution Principle,LSP)
如何玩继承。
所有引用基类(父类)的地方必须能透明地使用其子类地对象。
里氏替换原则是实现开闭原则地重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
在使用里氏替换原则时需注意:
- 子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。
- 我们在运用里氏替换运算原则时,尽量把父类设计为抽象类或接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便的扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。
- Java语言中,在编译阶段,Java编译器会检查一个程序是否符合里式替换原则,这是一个与实现无关、纯语法意义上的检查,但Java编译器的检查是由局限的。
四、依赖倒转原则(Dependency Inversion Principle:DIP)
如何玩继承和多态。
抽象不应该依赖细节,细节应当依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(DependencyInjection,DI)的方式注入到其他对象中,依赖注入是指一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入、设值注入(Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。
开闭原则是目标,里氏代换原则是基础,依赖倒装原则是手段。
五、接口分离原则(Interface Segregation Principle:ISP)
接口如何定义。
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。
六、合成复用原则(Co'mposite Reuse Principle,CRP)
如何处理继承关系和组合/聚合关系。
尽量使用对象组合,而不是继承来达到复用。、
七、迪米特原则(Law Of Demeter)
最少认知原则,如何处理类与类的关系。
一个软件实体应当尽可能少地与其他实体发生相互作用。
可降低系统的耦合度,使类与类之间保持松散的耦合关系。
迪米特原则还有几种定义形式,包括:不要和"陌生人"说话,只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几类:
- 当前对象本身(this);
- 以参数形式传入到当前对象方法中的对象;
- 当前对象的成员对象;
- 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
- 当前对象所创建的对象。
迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。
在迪米特法则运用到系统设计中时,要注意下面的几点:
- 在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;
- 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;
- 在类的设计上,只要有可能,一个类应当设计成不变类;
- 在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
网友评论