设计原则:
1.找出应用可能变化的地方,独立出来
2.针对接口编程,而不是针对实现编程
3.多组合,少继承
举例:
各种鸭子有共同的特性的方法比如游泳,会飞。区别就是外形不一样,红色的,有白色的。。。
父类:duck 属性方法:swim() fly() 子类扩展:display()
突然有一天,老板说鸭子也有不会飞的,怎么改程序呢?
最简单粗暴的方法是:用继承。
对于不会飞行鸭子的子类,就覆盖fly()方法,什么都不做。
问题来了,
1: 代码重复,假设有多种会倒着飞的鸭子,比如南方倒飞鸭,北方倒飞鸭,就要写很多一样的fly()方法
2:很难知道fly()到底有多少种,因为都用fly这个名字。以后也许会有可以直接起飞的鸭子。
3:运行时的行为不容易改变。比方说大多数一般的鸭子不用覆盖fly()方法,用父类的fly方法(跑着飞),但是以后发明了一种兴奋剂,普通鸭子吃了以后就可以直接起飞了。
但是它的fly方法不可以改变了。哭死了。
4:改变会牵一发动全身。不能轻易改父类的fly()里方法,因为所有鸭子都在复用这个方方法。
改进一下呢:用接口。
把fly做成接口。虽然可以不会飞的鸭子不用实现接口。
问题又来了:
1: fly还是不能复用。
2: 有多种fly,结果名字一样。
变化的部分,分离出来。
封装行为大局观