一.什么是策略模式?
百度解释:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。简单来说就是对算法的封装,将每一个算法封装到具有共同接口的独立类中,从而使他们可以相互替换。
二.策略模式的原则?
封装变化的原则(主要特点)
针对接口,超类编程而不是针对实现编程
多用组合少用继承
三.使用场景?
举例子:例子1:出行旅游时候,有多种出行方式,飞机,火车,汽车等。这几种方式就是策略。
例子2:商场的打折活动,七折,八折,还是九折。这几种也是策略。
总结:
1. 当一个系统中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时;
2. 当一个系统需要动态地在几种算法中选择一种时;
3.当一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立
四.策略模式的结构组成?
角色 | 类别 | 说明 |
---|---|---|
Strategy | 抽象的策略 | 是一个接口或抽象类 |
ConcreteStrategy | 具体的策略类 | 实现了抽象的策略 |
Context | 一个普通的类 | 上下文环境,持有 Stragegy 的引用 |
对应的类图
五:Demo
以出行旅游为例子:
interface TravelStrategy{
public void travel();
}
public class AirplaneStrategy implements travelStrategy{
public void travel(){
System.out.println("乘飞机");
}
}
public class TrainStrategy implements travelStrategy{
public void travel(){
System.out.println("坐火车");
}
}
public class BycleStrategy implements travelStrategy{
public void travel(){
System.out.println("骑自行车");
}
}
public class PersonContext{
TravelStrategy travelStrategy;
public Person(TravelStrategy travelStrategy){
this.travelStrategy=travelStrategy;
}
public void travel(){
travelStrategy.travel();
}
}
public class Test{
public static void main(String[] args){
PersonContext personContext = new PersonContext(new TrainStrategy());
personContext.travel();//乘火车去旅游
}
}
六:策略模式的优缺点?
优点:算法可以自由切换
避免使用多重if语句判断
扩展性良好
缺点:策略类会增多
所有策略类都要对外暴露,或者说客户端必须知道所有的策略类。