设计模式---策略模式

策略模式:它定义了算法家族,分别封装起来,让它们之间开源互相替代,此模式让算法的变化,不会影响到使用算法的客户。

运用场景:商场收银软件,营业员根据客户所购买的单价和数量,向客户收费。但是根据活动的不同,每次的价格都不一样。比如,全场打八折、全场打五折、满300减100等活动。如果用if-else作处理的话,就显得很累赘,加上如果拓展更多的活动,只能添加更多的分支。
在这里插入图片描述
CashContext类,是对策略的运用。

public class CashContext {
//维护着策略类的引用,调用策略,只需要设置不同的策略既可。
    private CashSuper cashSuper;

    public CashContext(CashSuper cashSuper){
        this.cashSuper = cashSuper;
    }
	//设置不同的策略
    public void setCashSuper(CashSuper cashSuper){
        this.cashSuper = cashSuper;
    }
 	//各个策略的不同实现
    public double getResult(double money){
        return cashSuper.acceptCash(money);
    }

}

策略的抽象类

/**
 * 策略的抽象方法,各个具体的策略会继承该接口实现具体的方法,该类就是strategy
 */
public interface CashSuper {

    /**
     * 计算实际的价格,有打折8折,有满减,有正常收费,三种情况对应着三个策略子类,对该方法的具体实现
     * @param money 价格,传入商品的价格,返回各个活动后的价格
     */
    public double acceptCash(double money);
}

具体实现的子类:

/**
 * 正常价格,不打折
 */
public class CashNormal implements CashSuper {
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
/**
 * 构建打折的子类,只需要传入不同的折扣就可以了
 */
public class CashRebate implements CashSuper{
    private double rebate; //打折

    public CashRebate(double rebate) {
        this.rebate = rebate;
    }


    @Override
    public double acceptCash(double money) {
        return money * rebate;
    }
}
/**
 * 满减
 */
public class CashReduce implements CashSuper{

    //满多少钱
    private double targetMoney;
    //减多少钱
    private double reduceMoney;

    public CashReduce(double targetMoney, double reduceMoney){
        this.targetMoney = targetMoney;
        this.reduceMoney = reduceMoney;
    }

    @Override
    public double acceptCash(double money) {
        if (money >= targetMoney){
            return money - reduceMoney;
        }else {
            return money;
        }
    }
}

测试类:

public class StategyTest {
    public static void main(String[] args) {
        //正常价格
        CashContext cashContext = new CashContext(new CashNormal());
        double result = cashContext.getResult(80);
        System.out.println("正常价格:" + result);

        //满300减100,需要更多的满减,只需要创建不同构造函数的类就好了
        CashReduce cashReduce = new CashReduce(300, 100);
        //设置策略
        cashContext.setCashSuper(cashReduce);
        result = cashContext.getResult(300);
        System.out.println("满300减100:" + result);

        //所有的商品打八折

        CashRebate cashRebate = new CashRebate(0.8);
        //设置策略
        cashContext.setCashSuper(cashRebate);
        result = cashContext.getResult(100);
        System.out.println("所有商品打八折:" + result);
    }
}

解析:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值