设计模式(九)策略模式
引子
策略模式,从命名上来看,应该是对待不同的情况,使用不同的策略,不同的对策。我们都有考过驾照,但是驾照分很多等级,有A照、B照、C照之分。每种驾照对应不同的驾驶车型,那么我们就以小王考驾照为例子,实现一下策略模式。
官方定义:Strategy Pattern(策略模式)也是一种比较简单的模式,也叫做政策模式,定义一组算法,将每个算法都封装起来,并且式它们之间可以互换。
来看类图
抽象的策略角色
public interface License {
public void driverCarType();
}
具体的策略角色
public class ADriverLicense implements License{
@Override
public void driverCarType() {
System.out.println("A照,可以开重卡、大货!");
}
}
public class BDriverLicense implements License {
@Override
public void driverCarType() {
System.out.println("B照,可以开公交、客车");
}
}
public class CDriverLicense implements License {
@Override
public void driverCarType() {
System.out.println("C照,可以开轿车、SUV!");
}
}
封装角色
public class SmallWang {
//构造函数,要用哪种驾照
private License license;
public SmallWang(License l) {
this.license = l;
}
//使用驾照
public void driver() {
this.license.driverCarType();
}
}
策略模式的优点
- 算法可以*切换;
- 避免使用多重条件判断;
- 扩展性良好。
策略模式的缺点
- 策略类数量增多;
- 所有的策略类都需要对外暴露。
策略模式的使用场景
- 多个类只有在算法或行为上稍有不同的场景。
- 算法需要*切换的场景。
- 需要屏蔽算法规则的场景。
策略模式的注意事项
如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题,否则日后的系统维护就会成为一个烫手山芋,谁都不想接。