设计模式之策略模式

策略模式,对当前发生的问题可以有对应的解决方案
例如超市活动:

package com.example.demo.pattern.strategy;

//先定义一个现金收费策略的抽象类,当然如果使用接口也可以
public abstract class CashSuper {
    public abstract double acceptCash(double money);
}
package com.example.demo.pattern.strategy;

//这是满**返**的具体策略类,承父类,重写抽象方法。
//在实例化对象的时候,需要传入两个参数,
//moneyCondition:满多少钱
//moneyReturn:返多少钱
public class CashReturn extends CashSuper {

    private double moneyCondition=0;
    private  double moneyReturn=0;

    public CashReturn(String moneyCondition,String moneyReturn){
        this.moneyCondition=Double.valueOf(moneyCondition);
        this.moneyReturn=Double.valueOf(moneyReturn);
    }

    @Override
    public double acceptCash(double money) {
        return money-Math.floor(money/moneyCondition)*moneyReturn;
    }
}

package com.example.demo.pattern.strategy;

//这是打折的具体策略类,在该类的实例对象进行初始化的时候,
//需要传入指定的打折的折扣参数moneyRebate,继承父类,重写抽象方法
public class CashRebate extends CashSuper {
    //定义默认折扣
    private double moneyRebate=1;
    //修改折扣调用此方法
    public CashRebate(String moneyRebate){
        this.moneyRebate=Double.valueOf(moneyRebate);
    }

    @Override
    public double acceptCash(double money) {
        return money*moneyRebate;
    }
}

package com.example.demo.pattern.strategy;

//这是正常收费的具体策略类,继承抽象类,完成方法的重写。
public class CashNormal extends CashSuper {

    @Override
    public double acceptCash(double money) {
        return money;
    }
}

package com.example.demo.pattern.strategy;
//简单工厂+策略结合,将实例化具体策略的过程由客户端转移到Context类中,是应用的简单工厂。
public class CashContext {

    CashSuper cs=null;

    public CashContext(String type){
        switch (type){
            case "1":cs=new CashNormal();break;
            case "2":cs=new CashRebate("0.8");break;
            case "3":cs=new CashReturn("300","100");break;
        }
    }

    public double GetResult(double money){
        return cs.acceptCash(money);
    }

}

public class Program {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入收费类型:");
        String type=sc.next();
        System.out.print("请输入商品总价:");
        String money=sc.next();
        CashContext cscon=new CashContext(type);
        System.out.println("需要收费:"+cscon.GetResult(Double.valueOf(money)));
    }

}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值