首先要清楚,封装、继承、多态是面向对象的三大特性。并不是说在设计程序的时候,类的结构使用到了或者体现出了这三个特性就是面向对象。
真正的面向对象设计是需要符合五大基本原则的。
单一职责原则SRP(Single Responsibility Principle)
认为一个类应该仅具有一种单一功能,只有一个能引起他变化的原因。
在面向对象编程中,高内聚,低耦合是软件设计追求的目标。可以把单一职责原则看为高内聚,低耦合的引申。职责过多,可能引起变化的原因就越多,这将是导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。
开闭原则(Open Closed Principle)
软件实体(包括类、模块、功能等)应该对扩展开放,但是对修改关闭。
- 对扩展开放:即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!
- 对修改封闭:在扩展的时候不需要对原有的代码进行修改。
依赖倒置原则DIP(Dependence Inversion Principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!而DIP原则就是高层模块不应该直接依赖于底层模块的具体实现,而应该依赖于底层的抽象。换言之,模块间的依赖是通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。接口和抽象类不应该依赖于实现类,而实现类依赖接口或抽象类。这一点其实不用多说,很好理解,“面向接口编程”思想正是这点的最好体现。
接口隔离原则ISP(Interface Segregation Principle)
其一是不应该强行要求客户端依赖于它们不用的接口;其二是类之间的依赖应该建立在最小的接口上面。
实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护。
里氏替换原则LSP(Liskov Substitution Principle)
子类可以替换父类并且出现在父类能够出现的任何地方。
子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。在父类和子类的具体行为中,必须严格把握继承层次中的关系和特征,将基类替换为子类,程序的行为不会发生任何变化。同时,这一约束反过来则是不成立的,子类可以替换基类,但是基类不一定能替换子类。