1.什么是策略模式?
分别封装行为接口,实现算法族,父类里放行为接口对象,在子类里具体设定行为对象。原则是:分离变化部分,封装接口,基于接口编程各种功能。——算法的变化独立于算法的使用者。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。(来源菜鸟教程)
2.用例
需求一:需要创建不同种类的鸟
首先我们会想到创建一个鸟的父类,让不同种类的鸟作为子类来继承父类,几种鸟咱们就建几种
增加需求:鸟需要有行为 例如飞行、叫声
那继续改需求,父类则再次增加一个fly()的方法和一个birdCall()方法,而子类需要重写父类每一个方法。
然而对于如果有多个子类,如果飞行行为相同而叫声不同,那我还是得都去重写一下。这样的继承会达到n*n的复杂
所以 使用策略者模式,将行为方法(算法)封装成一个类,利用行为对象进行自由切换。如上述的需求,则将飞行及叫声的行为以接口展现,而不同的飞行不同的叫声行为将以分别实现他们的接口来完成。
如下结构:
public interface Fly {
public void fly();
}
/**
*实现接口类——飞行行为之一
*/
public class QuickFly implements Fly {
@Override
public void fly() {
System.out.println("quickFly");
}
}
/**
*飞行行为之一
*/
public class SlowlyFly implements Fly {
@Override
public void fly() {
System.out.println("slowly fly");
}
}
Call类似
下面是父类bird,将行为封装为对象进行组合。
public abstract class Bird {
private Fly fly;
private Call call;
public Bird()
{
}
public void Fly()
{
fly.fly();
}
public void Call()
{
call.call();
}
}
3.注意点:
1.分析项目中变化部分与不变部分。变化部分抽取出来,通过接口实现,以对象形式进行组合。
2.多用组合少用继承。(继承虽然可代码复用,但对于不需要父类方法的子类也复用过来了)。用行为类组合,而不是行为的继承。不用重写方法,而在超类里使用行为对象。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。