一、定义
策略模式—定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
该模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
应用举例: ① 诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 ② 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
二、使用场景以及优缺点
使用场景:
1、若在一个系统里面有许多类,相互之间的区别仅在于它们的行为,此时使用策略模式可以动态地让一个对象在许多行为中选择一种行为,例如:旅行的出游方式。
2、在系统中需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
优点:
1、提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
2、可以避免使用多重条件语句。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露,客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
三、代码实现举例
(1)创建一个接口
public interface FlyBehavior {
public void fly();
}
(2)创建两个实现类
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying ! !!");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly ! ! !");
}
}
(3)创建 Animal 类
public class Animal {
private FlyBehavior flyBehavior;
public Animal(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void performFly(){
flyBehavior.fly();
}
}
(4)使用 Animal 来查看当它改变策略 FlyBehavior 的行为变化。
public class StrategyTest {
public static void main(String[] args) {
Animal animal_1 = new Animal(new FlyNoWay());
Animal animal_2 = new Animal(new FlyWithWings());
animal_1.performFly();
animal_2.performFly();
}
}
输出的结果:
I can't fly ! ! !
I'm flying ! !!
四、总结
策略模式的主要角色如下。
- 抽象策略(FlyBehavior)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(FlyWithWings、FlyNoWay) 类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Animal)类:持有一个策略类的引用,最终给客户端调用。