策略模式定义:是指定义了算法分别封装起来,让他们之间可以相互替换,算法的变化不用影响到使用算法的用户。策略模式可以避免多重分支的使用,比如 if else 和 switch。
策略模式的应用场景:
1、假如系统中有很多类,区别仅仅在于他们的行为不同。
2、系统需要动态的在几种算法中选择一种。
实际应用场景举例:
1、优惠券的使用场景 (无优惠、团购策略、优惠券使用、返现策略),不同的促销活动会使用不同的优惠策略。
代码举例:
首先定义策略接口
/**
*促销策略
*/
public interface PromotionStrategy {
/**
* 搞促销活动
*/
void doPromotion();
}
不同的策略实现该接口
/**
* 返现策略
*/
public class CashbackStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("返现促销,返回的金额到支付宝账户");
}
}
-------------------------------------------------------------------------
/**
* 优惠券策略
*/
public class CouponStrategy implements PromotionStrategy {
public void doPromotion() {
System.out.println("领取优惠券,价格直接减去优惠券价格");
}
}
-----------------------------------------------------------------------
/**
* 团购策略
*/
public class GroupBuyStrategy implements PromotionStrategy{
public void doPromotion() {
System.out.println("10人成团,全团享受优惠价格");
}
}
再定义促销活动,去使用策略
/**
* 定义促销活动,使用优惠策略
*/
public class PromotionActivity {
PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy){
this.promotionStrategy = promotionStrategy;
}
/**
* 活动发布
*/
public void execute(){
this.promotionStrategy.doPromotion();
}
}
写个测试类,执行促销活动,打印使用的策略信息
public class PromotionActivityTest {
public static void main(String[] args) {
// PromotionActivity activity618 = new PromotionActivity(new CouponStrategy());
// activity618.execute();
// PromotionActivity activity11 = new PromotionActivity(new CashbackStrategy());
// activity11.execute();
PromotionActivity activity = null;
String strategyKey = "COUPON";
if(strategyKey.equals("COUPON")){
activity = new PromotionActivity(new CouponStrategy());
}else if(strategyKey.equals("CASH")){
activity = new PromotionActivity(new CashbackStrategy());
}
activity.execute();
}
}
输出信息:
领取优惠券,价格直接减去优惠券价格
使用者(活动类)可以根据自己需要选择不同的促销策略,达到目的。
上面测试类中的, if else 多重条件判断,还可以通过工厂单例模式 ,根据不同的stratehyKey,直接得到对应的策略来使用。进一步减少开发人员的工作量,更符合系统开闭原则。