对象导论 - 02 (面向对象如何设计)
SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)五个基本原则
1.单根继承结构
所有的类继承于单一的基类,保证所有的对象都具有某些功能,参数传递可以得到极大的简化,使得垃圾回收器的实现变得容器的多。所有对象都保证具有类型信息,不会因为无法确定对象的类型而陷入僵局。
* 组合与继承的区别:
组合:使用现有的类合成新的类,这个概念叫组合。组合被视为"has-a" 拥有关系,比如”汽车拥有引擎“。组合带来了极大的灵活性。
继承:继承被视为"is-a or is-like-a" 关系。
2. 隐藏具体实现(封装)
1)可以保护数据不被轻易修改,可以减少程序的 bug。Java 使用 public, private, protected 关键字和默认的包访问权限进行显式访问控制。
2)让接口和实现分离,可以轻易地进行重构。
3.多态
程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的。
* 前期绑定与后期绑定:指的是方法与类的绑定,抽象说法即行为与行为的调用者的绑定。
编译器无法产生传统意义上的函数调用,一个非面向对象编程的编译器产生的函数调用会引起所谓的“前期绑定(静态绑定)”。
前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现,比如 C;在 Java 中被 private、final、static 修饰的方法和构造方法是前期绑定的。
后期绑定:在运行时根据具体对象的类型进行绑定。这需要建立一个机制,在运行期判断方法主体的类型。
4.接口隔离
接口确定了对某一特定对象所能发出的请求。在类型中,每一个可能的请求都有一个方法与之关联,当向对象发送请求时,与之相关联的方法就会被调用。多个特定客户端接口要好于一个宽泛用途的接口。
5.参数化类型(范型)
通常,容器中只存储Object,对于放进去的对象可能会丢失类型信息。当对象取出时,必须向下转型和运行时检查类型信息。为了解决这个问题,使用参数化类型机制,编译器可以自动定制作用于特定类型上的类。
ArrayList<Shape> shapes = new ArrayList<Shape>();