定义
定义一组算法,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实列
需要创建一个SimuDuck系统,模仿各种不同鸭子。不同种类的鸭子通常具有不同的外观,飞行,发声及游泳方式。
最初的实现:
因为不同类型的鸭子飞行和发声行为不同,绿头鸭和红头鸭会飞,橡皮鸭不会飞也不会叫,如果通过继承来对每一个具体类都重写这些方法造成的问题有:
1.代码在多个子类重复;
2.运行时无法改变子类的行为;
每个子类都重写fly和quack,有时鸭子不具有该行为,但也要重写。
使用策略模式的实现:
通过使用组合(“has a”, not “is a”)的方式,将飞行和发声委托给其他类(一组算法),本身只含有这些类的接口类。
这样的设计遵循了3个原则:
1.找出代码中会变化的部分,封装起来,让不变的部分尽量不受影响;
2.针对接口编程,而不是针对实现编程;
3.多用组合,少用继承。
现在的Duck类中,performQuack和performFly,以及flyBehavior, quackBehavior都是固定的接口,通过不同的实例来实现不同的操作,减少对客户端代码的改变。