“要针对接口编程,不要针对实现编程。”那么,在java的世界里,这里的接口指的是什么呢?无非是以下两种实现方式:
方式1)抽象类(只能有一个超类)
方式2)接口Interface(可以继承多个Interface)
那么何时使用抽象类,何时使用接口呢?回答这个问题,得搞清楚二者各自的优势。说白了是为了更好的应对变化。
一个是接口本身的变化,一个是接口实现的变化。
对于Interface而言,能够很好的应对接口实现的变化,但是很难应对接口本身的变化。一旦Interface发生变化,所有的实现都需要同时变化。如果实现类很多,那将是噩梦,甚至是不可行。
对于抽象类而言,接口本身的变化可以轻松应对。只要在抽象类中提供默认实现就可以轻松增加行为。
但是,我们也要看到,抽象类的实现存在短处。就是实现类必须对抽象类忠心不二。如果需要以另一种视角来看待同一个实现类,就只能使用Interface了。换句话说,Interface带来了多角度的好处。
Interface和抽象类并不是互斥的。你可以提供一个接口说“你可以使用这些功能”,在提供一个超类说“这是一种实现方式”。此时使用者应该应用接口类型,这样未来的维护者就可以根据需要随时替换新的实现。