大话设计模式-策略模式(大鸟和小菜Java版)

策略模式:策略模式是指有一定行动内容的相对稳定的策略名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。(来自百度百科)

这个策略模式,我感觉和贪心算法差不多,也就是找出来最优解,对自己最有利的策略

package 设计模式.策略模式;
//这个是抽象类,里面含有一个抽象方法,子类在继承的时候,必须要重写抽象方法
public abstract class CSuper {
    public abstract double acceptCash(double money);
}
//继承父类
class CashNormal extends CSuper{
//重写抽象方法
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
//继承父类
class CashRebate extends CSuper{
//    定义一个局部变量
    private double moneyRebate = 1.0;
//    构造方法

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

    //重写抽象方法
    @Override
    public double acceptCash(double money) {
        return money * moneyRebate;
    }
}

class CashReturn extends CSuper{
    //    满多少,满足条件的变量
    private double moneyCondition = 1.0;
//    返多少,减去的变量
    private double moneyReturn = 1.0;
//构造方法

    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }

    //重写抽象方法
    @Override
    public double acceptCash(double money) {
        double result = money;
        if(money >= moneyCondition){
            result = money - Math.floor(money / moneyCondition) * moneyReturn;
        }
        return result;
    }

}
//计算这几种情况的类
class CashContext{
    CSuper cs = null;

    public CashContext(String type) {
        switch (type){
//            正常收费的情况
            case "正常收费":
                CashNormal c0 = new CashNormal();
                cs = c0;
                break;
//                满300返100的情况
            case "满300返100":
                CashReturn c1 = new CashReturn(300,100);
                cs = c1;
                break;
//                打8折的情况
            case "打8折":
                CashRebate c2 = new CashRebate(0.8);
                cs = c2;
                break;
        }
    }
//计算出最后的总钱数,返回给主函数
    public double getResult(double money) {
        return cs.acceptCash(money);
    }
}

上面的是对各个类的书写,下面对主类进行书写

package 设计模式.策略模式;

import java.util.Scanner;

public class CClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        CashContext context = new CashContext("正常收费");
        System.out.println("请输入需要支付的钱数:");
        int m = sc.nextInt();
        double money0 = context.getResult(m);
        System.out.println("单价为:"+money0+"元,"+"正常收费"+money0+"元");

        context = new CashContext("打8折");
        double money1 = context.getResult(m);
        System.out.println("单价为:"+money0+"元,"+"打8折:"+money1+"元");

        context = new CashContext("满300返100");
        double money2 = context.getResult(m);
        System.out.println("单价为:"+money0+"元,"+"满300返100:"+money2+"元");
    }
}

相关结果

本文参考文章(更加详细):https://blog.csdn.net/qq_409407189/article/details/83346363

以上就是策略模式的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值