學習資料:http://blog.lmj.wiki/2016/11/21/design-pattern/strategy/
場景描述
小光是一個碼農(nóng)征唬,回老家創(chuàng)業(yè)賣熱干面壶辜,突然有一天小光想到幾個活動策略靖避,如下:
- 即日起, 到感恩節(jié)(11/24)那天, 所有飲品6折優(yōu)惠.
- 雙十二當天, 滿12立減2元.
- 12月20號到圣誕節(jié)(12/25), 買熱干面+飲料套餐送大蘋果.
但是這樣隨之而來問題是高蜂,面對不同的活動面氓,需要不同的計算來收銀,這樣有點麻煩汁胆。小光想我怎樣提供幾個算法怠益,到時直接來用呢贮乳。于是小光想了想忧换,做出了如下行為:
/**
* 策略模式
*/
public interface CeLueModle {
// 定義抽象方法,不同的活動期間塘揣,經(jīng)過不同的算法包雀,得出應收金額
String getActivityPrice();
}
/**
* 感恩節(jié)活動
*/
public class ThinksGivingDay implements CeLueModle {
@Override
public String getActivityPrice() {
// 不同的邏輯處理
return "感恩節(jié)所有飲品6折";
}
}
/**
* 雙十二活動
*/
public class DoubleTwelveDay implements CeLueModle{
@Override
public String getActivityPrice() {
// 邏輯處理
return "雙十二當天滿12減2元";
}
}
/**
* 平時沒有活動
*/
public class DefalutActivity implements CeLueModle {
@Override
public String getActivityPrice() {
// 邏輯處理
return "平時沒有活動";
}
}
/**
* 創(chuàng)建收銀臺的類
*/
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();
// 感恩節(jié)
checkStand.setActivity(new ThinksGivingDay());
checkStand.printPrice();
// 雙十二
checkStand.setActivity(new DoubleTwelveDay());
checkStand.printPrice();
}
}
總結:
策略模式就是在接口中定義一個或多個抽象方法,一般是一個算法方法亲铡,子類實現(xiàn)接口并各自封裝好各自的算法才写,我們在用的時候通過一個統(tǒng)一管理類葡兑,傳入不同的參數(shù),就可以運用不同的算法赞草,使其各不受影響讹堤。
其實我覺得策略模式,有點像java中的多態(tài)厨疙,同一個行為在面向不同的對象時洲守,有不同的表現(xiàn)形式。