Head First定义:
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式的设计原则主要有三个:
- 找出应用中可能需要变化的部分,把它们独立起来。
- 针对接口编程,而不是针对实现编程。
- 多用组合,少用继承。
举个例子
现在需要设计一个鸭子类(Duck),有很多不同的鸭子(红头鸭、绿皮鸭、橡皮鸭、木头鸭...),所以Duck为这些鸭子的父类。
要求如下:每种鸭子都有自己的外形特征;鸭子都有游泳的行为;有些鸭子可能会飞(玩具鸭就不会飞);有些鸭子可能会叫(木头鸭就不会叫);不同种类的鸭子可能叫的不一样。
(1)首先我们将鸭子共有的特征行为抽象成方法:swim(游泳)和display(外形)
swim是不会变的,用具体的方法实现。而每中鸭子的外形不一样,所以display可以设计为抽象方法,由具体的子类来实现。
(2)将需要变化的部分独立出来(原则1):fly(飞行)和quack(叫)
fly抽象成接口FlyBehavior,该接口有两个具体的实现类,一个实现鸭子的飞行,另一个实现不会飞。(这里也就是策略模式定义所说的算法族)
quack抽象成接口QuackBehavior,该接口有三个具体的实现类,分别实现真实鸭子的瓜瓜叫、橡皮鸭子的吱吱叫、木头鸭子的不会叫。(同理,这也是个算法族)
然后将FlyBehavior与QuackBehavior作为Duck类的成员属性(原则3)。并在Duck中分别提供访问两个接口的行为的方法performFly和performQuack,所以Duck还是有4个行为方法。
而两个接口类型属性的实例化,可以有两种方式注入,通过构造函数,或者通过setter方法。(原则2)
最后可以得到Duck类的设计如下:
(图片来自:https://blog.csdn.net/lisiyuannnn/article/details/52460185)