学习资料:http://blog.lmj.wiki/2016/11/21/design-pattern/strategy/
场景描述
小光是一个码农,回老家创业卖热干面,突然有一天小光想到几个活动策略,如下:
- 即日起, 到感恩节(11/24)那天, 所有饮品6折优惠.
- 双十二当天, 满12立减2元.
- 12月20号到圣诞节(12/25), 买热干面+饮料套餐送大苹果.
但是这样随之而来问题是,面对不同的活动,需要不同的计算来收银,这样有点麻烦。小光想我怎样提供几个算法,到时直接来用呢。于是小光想了想,做出了如下行为:
/**
* 策略模式
*/
public interface CeLueModle {
// 定义抽象方法,不同的活动期间,经过不同的算法,得出应收金额
String getActivityPrice();
}
/**
* 感恩节活动
*/
public class ThinksGivingDay implements CeLueModle {
@Override
public String getActivityPrice() {
// 不同的逻辑处理
return "感恩节所有饮品6折";
}
}
/**
* 双十二活动
*/
public class DoubleTwelveDay implements CeLueModle{
@Override
public String getActivityPrice() {
// 逻辑处理
return "双十二当天满12减2元";
}
}
/**
* 平时没有活动
*/
public class DefalutActivity implements CeLueModle {
@Override
public String getActivityPrice() {
// 逻辑处理
return "平时没有活动";
}
}
/**
* 创建收银台的类
*/
public class CheckStand {
private CeLueModle activity;
public CheckStand(){
activity = new DefalutActivity();
}
public CheckStand(CeLueModle activity){
this.activity = activity;
}
public void setActivity(CeLueModle activity){
this.activity = activity;
}
public void printPrice(){
Log.e("TAG",activity.getActivityPrice());
}
}
/**
* 投入使用
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 没有活动
CheckStand checkStand = new CheckStand();
checkStand.printPrice();
// 感恩节
checkStand.setActivity(new ThinksGivingDay());
checkStand.printPrice();
// 双十二
checkStand.setActivity(new DoubleTwelveDay());
checkStand.printPrice();
}
}
总结:
策略模式就是在接口中定义一个或多个抽象方法,一般是一个算法方法,子类实现接口并各自封装好各自的算法,我们在用的时候通过一个统一管理类,传入不同的参数,就可以运用不同的算法,使其各不受影响。
其实我觉得策略模式,有点像java中的多态,同一个行为在面向不同的对象时,有不同的表现形式。