设计模式之策略模式

策略模式定义:是指定义了算法分别封装起来,让他们之间可以相互替换,算法的变化不用影响到使用算法的用户。策略模式可以避免多重分支的使用,比如 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,直接得到对应的策略来使用。进一步减少开发人员的工作量,更符合系统开闭原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值