阶段一:
- 有一个Duck的超类。里面包含了一些正常的方法。
需 求:需要给鸭子们实现一个会飞的动作。fly()
第一次实现:在父类中进行实现fly()
结果: 对于部分子类来说,没有必要的行为这个行为,比如橡皮鸭子不应该有fly()方法。这个地方即使重写了此方法。用doNothing()什么都不做。还是不好算是垃圾代码。
阶段二:
我们应该把变化的部分,和不变的部分进行区分。
比如fly()方法不应该放入duck类中。我们可以将其抽取为接口flyable(),将其和duck类进行解耦。当部分subDuck类需要实现fly()方法时,直接实现就行。这样就让比如橡皮鸭这种子类,就可以脱离部分垃圾代码了。
问题:解耦确实解耦,目的也达到了,但是有个问题。代码将不能复用,每个实现该fly()接口的,如果方法实现都是一样的,则会出现每实现一次该接口,就得重写该方法,即便逻辑未变。
解决方法:面向接口编程。用一个更加具体的接口去实现fly()接口,这种类称为行为类。
阶段三:
这个地方主要在于面向接口编程。千万别面向继承编程。充分利用多态的功能。
比如有一个animate超类 ,有dog 和 cat子类。以下为演进过程
- Dog a = new Dog();
- Animate b = new Dog();
- Animate c = getAnimate();
设计原则
- 区分不变的和变的 。 封装变化的。