策略模式:它定义了算法组,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端。
例子:鸭子具有飞行、鸭叫的行为。不同类型的鸭子,其行为各不相同,如橡皮鸭不会飞,是吱吱叫。火箭鸭是利用火箭进行飞,是轰轰叫。如果用继承鸭子基类及实现fly接口、quackable接口的方式,那么第一个是代码量很多,需要为每个鸭子都实现fly、quack方法。另外飞行行为需要改变,比如所有飞行行为前都需要检查是否系好安全带,那么所有的鸭子都得改变代码。如果抽象类的有个fly的默认实现,这样子所有的鸭子都会继承到这个fly行为,并需要检查自己是否符合此默认的fly行为,不符合得覆盖。也就是说没添加一个鸭子,都得去检查并很大可能得去覆盖默认的fly方法。所以,继承并不是好方法。
解决方案:
设计原则1: 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起了。
结合例子:我们知道,鸭子的飞行及鸭叫行为会随着鸭子的不同而改变,为了分离出来,我们应该建立一组新类来代表这两个行为。
设计原则2:针对接口编程,而不是针对实现编程。所以行为类应该有接口。
设计原则3:多用组合,少用继承。所以鸭子类组合类飞行为类,鸭叫行为类。
根据上面三个原则,针对鸭子使用策略模式,每个鸭子内有飞行行为类及鸭叫行为类。并能够动态改变。类图如下
: