1、什么是策略模式
将类中经常改变或者可能改变的部分提取作为一个抽象策略接口类,然后在类中包含这个对象的实例,这样类实例在运行时就可以随意调用实现了这个接口的类的行为
比如定以一系列的算法,把每一个算法封装起来,并且使可以相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式
1、环境类(Context):通过ConcreteStrategy具体策略来配置,持有Strategt对象并维护对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据
2、抽象策略类(Strategy):定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法
3、具体策略(ConcreteStrategy):Strategy接口的具体算法
2、代码
促销活动
环境类
java
public class CuXiaoContext {
private CuXiao cuXiao;
public CuXiaoContext(CuXiao cuXiao) {
this.cuXiao = cuXiao;
}
//定义一个使用算法的方法
public void use(){
cuXiao.cuxiao();
}
}
抽象策略类
java
public interface CuXiao {
void cuxiao();
}
具体策略类
6.18
java
public class SuanFa618 implements CuXiao {
@Override
public void cuxiao() {
System.out.println("使用6.18的促销算法");
}
}
11.11
java
public class SuanFa1111 implements CuXiao{
@Override
public void cuxiao() {
System.out.println("使用11.11的促销算法");
}
}
测试
java
public class CuXiaoTest {
public static void main(String[] args) {
//SuanFa618 suanFa618 = new SuanFa618();
SuanFa1111 suanFa1111 = new SuanFa1111();
CuXiaoContext context = new CuXiaoContext(suanFa1111);
context.use();
}
}
3、策略模式优缺点
优点:
1、算法可以自由切换(策略类自由切换)
2、避免使用多重条件判断
3、扩展性良好 (符合开闭原则)
缺点:
1、策略类会增多(导致类爆炸)
2、所有策略类都需要对外暴露
3、客户端必须知道所有的策略类,才确定要调用的策略类
4、策略模式使用场景
1、如果在以一个系统里面又许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
2、一个系统需要动态地在几种算法中选择一种
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现