设计模式(九)策略模式

引子

策略模式,从命名上来看,应该是对待不同的情况,使用不同的策略,不同的对策。我们都有考过驾照,但是驾照分很多等级,有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个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题,否则日后的系统维护就会成为一个烫手山芋,谁都不想接。