原则1:最小化类及其属性/方法的访问权限。(Minimize The Accessibility of Classes and Members)
通过封装,抽象实现信息的隐藏。尽量声明属性为私有。之通过相应的共有方法去访问这些属性。
原则2:组合由于继承。(Favor Composition Over Inheritance)
除了继承之外,我们还可以通过将现有的对象组合起来实现新的功能来达到重用的目的。新的功能可以通过代理的方式来实现。有些时候我们也可以用聚合(aggregation)的方式来实现。
使用继承的问题:
- 破坏了封装。子类必须知道父类的实现细节才能够使用或重写父类的方法。(“白盒”方式的重用)
- 如果父类的实现细节被改变,则子类必须改变。
- 子类中从父类继承过来的实现细节不能在运行时被改变。
- 滥用继承会导致非常复杂的继承树结构。从而影响系统的重用性。
使用组合的优点:
- 被包含的对象只能通过其包含对象来访问,这样就实现了“黑盒”方式的重用。
- 减少了很多实现时的依赖。例如客户端不需要依赖被包含对象。
- 每一个类可以只关注一个简单的任务。
- 对象的组合可以在运行时动态地来定义。
原则3:依赖倒置原则(Dependency Inversion Principle)
这个原则也是常说的"面向接口而非面向其实现编程"。这样在将来任何该接口的实现类都可以不做任何修改地工作在客户端。
原则4:开闭原则(Open-Close Principle)
一旦一个类已经交付使用,该类可以允许继承但不应该允许直接的修改。但是在一个系统的实现中不可能总是遵循OCP原则,但应尽量地去遵守。
原则5:Liskov替换原则(LSP)
子类型必须在任何时候都能替换父类型。这样的好处就是客户类只需要面向父类或接口编程就可以了,而不需要关心任何可能的子类。