- 策略模式
定义
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
应用场景
在开发过程中常用到这种情况,实现一个功能有多种算法或策略,我们需要根据不同的应用场景选择不用的算法。所以,我们需要把一个类A中经常变化或者将来可能改变的部分抽取出来,并为之实现一个接口B,类A中只需要拥有这个接口B的句柄,根据需要时,为类A注入接口B的具体实现类C,通过上溯造型调用C中对接口B的方法的具体实现算法。定义一系列的算法(即接口B的实现类的算法),把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。其中接口B的具体实现类可能有多个,我们把它叫做一个算法族。
优缺点
优点:
1、可以动态的改变对象的行为
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
小知识点
上塑造型:上溯造型指将衍生类的句柄赋给基础类的句柄(即是将子孙类的句柄赋给祖先类的句柄),因为它是从一个更特殊的类型到一个更常规的类型,所以上溯造型肯定是安全的。但是上塑造型只能调用基础类定义的接口或方法。
下塑造型:相对于类型转换安全的上溯造型,下溯造型就未必是安全的了。我们经常会做些强制类型转换的事情,有时我们也会无意间遇到 ClassCastException的转换异常(从这一点来说,我们应该多用范型来避免不安全的类型转换)。例如:
public static void downcasting(Animal animal){
//DoorGod doorGod = (DoorGod)animal;
if(animal instanceof DoorGod){
DoorGod doorGod = (DoorGod)animal;
doorGod.guard();
}
if(animal instanceof Cat){
Cat cat = (Cat)animal;
cat.speak();
}
}
如果没有采取措施(上面使用的措施是instanceof)判断对象的类型,那么向下的强制转换就是不安全的。这种转换错误在编译时是不能检测出来的,只有在运行时才会抛出 ClassCastException异常,对于测试来说,这样的错误也是很难检测的。
设计原则:
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程,而非针对实现编程。
多用组合,少用继承。