OOP

面向对象的设计原则

Posted by Nathan on 2015-05-12

1.面向对象设计五大原则

面向对象设计的五大原则分别是单一职责原则、接口隔离原则、开放-封闭原则、替换原则、依赖倒置原则。

2.单一职责原则(single Pesponsibility Principle,SRP)

单一职责有两个含义:一个是避免相同的职责分散到不同的累中,另一个是避免一个类承担太多职责。 为什么遵守SRP:可以减少类之间的耦合,提高类的复用性。 SRP在实际代码中的应用: 工厂模式(Factory):根据不同的参数生成不同的实例化对象。它只负责生成对象而不负责对象的具体内容。如数据库操作,缓存操作。 命令模式:分离“命令的请求者”和“命令的实现者”方面的职责,达到请求和实现的解耦。如你去餐馆吃饭,餐馆有顾客,服务员,厨师三种职责。作为顾客只要列出菜单,传给服务员,服务员通知厨师,厨师去实现的过程。

3.接口隔离原则(Interface Segregation Principle,ISP)

接口隔离原则:表面客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块,简单地说就是使用多个专门的接口比使用单个接口要好的多。 “接口隔离”其实就是定制化服务设计的原则。使用接口的多重继承实现对不同的接口的组合,从而对外提供组合功能–达到“按需提供服务”。如PDO是一个抽象的数据接口层,它告诉我们接口应该是通用的、基本的、不易变化的,对于其他数据库特定的操作方法不应该出现到该接口里,减少对接口的污染。 接口污染的处理方式:利用委托分离接口,利用多继承分离接口。 委托方式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理,如策略模式、代理模式。

4.开放-封闭原则(Open-Close Principle,OCP)

Open(Open for extension)模块的行为必须是开放的,支持扩展的,而不是僵化的。Close(Closed for modification)在对模块的功能进行扩展时,不应该影响或大规模地影响已有的模块。一个模块在扩展性方面应该是开放的而在更改性应该是封闭的。 实现开放-封闭的核心思想是对抽象编程,而不对具体编程。因为抽象相对稳定。让类依赖固定的抽象,这样修改就是封闭的;而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过方法的覆写改变固有行为,实现扩展新的方法,所以对于扩展是开放的。 在设计方面充分应用“抽象”和封装的思想:一方面在软件系统中找出“可变因素”,将之封装起来;另一方面一种可变性因素不应当散落在多个不同代码模块中,而应当被封装到一个对象中。 在设计模式中,装饰模式比较明显地用到OCP。

5.替换原则(Liskov Substitution Principle,LSP)

替换原则:子类型必须能够替换掉它们父类型,并出现在父类能够出现的任何地方。LSP主要是针对继承的设计原则。 如何遵守该设计原则:父类的方法都要在子类中实现或重写,并且派生类只实现抽象类中声明的方法,而不应当给出多余方法的定义或实现;在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期绑定(动态多态)。 LSP包括使用多态实现隐藏基类和派生类对象的区别,以及组合的方式解决继承中的基类与派生类中不符合语意的情况。

6.依赖倒置原则(Dependence Inversion Principle,DIP)

依赖倒置原则:将依赖关系倒置为依赖接口。上层模块不应该依赖于下层模块,它们共同依赖于一个抽象;抽象不能依赖于具体,具体应该依赖于抽象。 专门由一个程序检测配置是否正确以及加载配置中所依赖的实现,这检测程序称为IOC容器。在J2EE中通常把DAO层和Service层细分为接口层和实现层,然后在配置文件中进行依赖关系倒置,这是常见的DIP应用。 如何满足DIP:每个较高层次类都为它所需要的服务提出一个接口声明,较低层次类实现这个接口;每个高层类都通过该抽象接口使用服务。