1 概念定义
策略模式: 就是把同一个功能或算法等抽象为一个接口方法。具体的实现用单独的类实现这个接口。然后我们再根据实际情况选择不同的算法或者策略(不同的实现类)来完成该功能, 通俗来讲,找出应用中可能需要变动的地方,把它们独立出来,并封装起来,不要和那些不需要变化的代码混在一起 ,使代码更加有弹性和扩展性。
2应用场景
系统有某部分功能是经常需要增加匹配功能(用if...else..或是swtic..case)的,如果每次修改都是在上一次的代码位置中增加,如此很多此处代码非常臃肿,那么我们可以把这该部分功能抽象封装成一个接口,不同的功能用不能的类实现,要用什么功能直接用某个实现类,
3组成部分
1 策略接口
2 很多具体策略实现
4示例场景说明
出行工具的不同,如码农我上班的交通工具无非就是:走路,坐公交,坐滴滴巴士,骑小毛驴(电动车),骑自行车,如按传统的方式编码都是if...else..来选择交通工具,一但我哪天多了一个上班交通方式,就得再此基础上加一个else,多100个方式就是多100个else,且每次选择有可能要执行99次选择才能选中自己需要的
5示例:传统方式
public class ChuanTongMain {
private static int mZiXingChe = 1;
private static int mGongjiao = 2;
private static int mDidiBashi = 3;
private static int mDiandongChe = 4;
public static void main(String[] args) {
chuXingGongGu(mZiXingChe);
}
private static void chuXingGongGu(int fashi){
switch(fashi){
case 1:
System.out.println("自行车");
break;
case 2:
System.out.println("公交");
break;
case 3:
System.out.println("滴滴巴士");
break;
case 4:
System.out.println("电动车");
break;
}
}
}
用策略模式
//定义策略接口(抽象交通工具)
public interface JiaotongGongJu {
public void xuanzeJiaoTong();
}
//具体各种交通方式的实现
public class DiandongChe implements JiaotongGongJu {
@Override
public void xuanzeJiaoTong() {
// TODO Auto-generated method stub
System.out.println("电动车");
}
}
public class DidiBashi implements JiaotongGongJu {
@Override
public void xuanzeJiaoTong() {
// TODO Auto-generated method stub
System.out.println("滴滴巴士");
}
}
public class GongjiaoChe implements JiaotongGongJu {
@Override
public void xuanzeJiaoTong() {
// TODO Auto-generated method stub
System.out.println("公交");
}
}
public class ZixingChe implements JiaotongGongJu {
@Override
public void xuanzeJiaoTong() {
// TODO Auto-generated method stub
System.out.println("自行车");
}
}
public class Feiji implements JiaotongGongJu {
@Override
public void xuanzeJiaoTong() {
// TODO Auto-generated method stub
System.out.println("飞机");
}
}
策略封装
public class Celue {
public void xuanzejiongtong(JiaotongGongJu mJiaotongGongJu){
if(mJiaotongGongJu != null){
mJiaotongGongJu.xuanzeJiaoTong();
}
}
}
策略选择触发
public class CelueMain {
public static void main(String[] args) {
Celue celue = new Celue();
celue.xuanzejiongtong(new Feiji());
}
}