Java 策略模式(strategy)

前言:

问:啥是“策略”
答:不同情况不同处理呗
问:那不就是 if…else 或者 switch 吗
答:本质上差不多吧
问:总有区别的吧,“策略”听起来感觉高级些
答:那肯定啊
问:到底啥区别
答:高级的东西用起来舒服,价格也贵
问:…,可以不用吗
答:可以啊,又没人逼你
问:那么豪横吗,来一套试试

1.策略模式举例

“策略”就如前言所说,这里举一个常见的栗子,我们去超市买东西,结账的时候会被各种询问,

收银妹子:您是会员吗
鄙人:不是
收银妹子:会员九五折,只需要登记一下手机号就行了呢,要不要开通一下呢
鄙人:(看了看千百块的东西,决定为了50块牺牲一下手机号)行吧
收银妹子:我看您这边买了很多东西呢,我们这边还有超级会员,购物九折起,并可享受随机立减,只需要交100块超级会员费就可以享受呢
鄙人:(这肯定是套路)没必要吧,就这样结账吧
收银妹子:上个付款的人也开了呢,最后八折付款的哦
鄙人:(赌一把,反正住在这儿附近,以后多来买肯定能回本)那开一个吧
收银妹子:您稍等,正在给您录入信息,需要等一会呢

2.实现策略模式

收银妹子:那个程序猿,按照我刚才说的,赶紧写一个程序部署到系统里面
程序猿:好的好的,马上搞定

先写个接口定义折扣

public interface Discount {
    double price(double money);
}

在写三个类,Common(普通人),Member(会员),Super(超级会员),并同时实现接口 Discount 的 price 方法

//普通人
public class Common implements Discount {
    @Override
    public double price(double money) {
        return 1.0 * money;
    }
}

//会员
public class Member implements Discount {
    @Override
    public double price(double money) {
    	DecimalFormat df = new DecimalFormat("0.00");
        double price = money * 0.95;
        return Double.parseDouble(df.format(price));
    }
}

//超级会员
import java.text.DecimalFormat;
public class Super implements Discount {
    @Override
    public double price(double money) {
        double i = 0.9 - Math.random() * (0.1);
        DecimalFormat df = new DecimalFormat("0.00");
        double price = money * i;
        return Double.parseDouble(df.format(price));
    }
}

再写一个"策略"类用于决定用哪个价格

public class PriceStrategy {
    private Discount discount;

    public PriceStrategy(Discount discount) {
        this.discount = discount;
    }

    public double getPrice(double money) {
        return discount.price(money);
    }
}

最后写个函数入口

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("输入金额:");
        double money = sc.nextDouble();
        System.out.print("输入会员等级(0:super,1:member,other:common):");
        int level = sc.nextInt();
        Discount discount;
        switch (level) {
            case 0:
                discount = new Super();
                break;
            case 1:
                discount = new Member();
                break;
            default:
                discount = new Common();
                break;
        }
        PriceStrategy strategy = new PriceStrategy(discount);
        System.out.println(strategy.getPrice(money));
    }
}

程序启动测试一下,输入10.00
结果如下:

输入金额:10.00
输入会员等级(0:super,1:member,other:common):0
您需要支付:8.19

应该没啥毛病吧
打包上传服务器,启动

3.end

鄙人:还没好吗
收银妹子:好了呢,你看,我们输入 1000,结果显示您需要支付 885.32

输入金额:1000
输入会员等级(0:super,1:member,other:common):0
您需要支付:885.32

鄙人:可以
收银妹子:欢迎下次光临,温馨提示您呢,超级会员只有一年的有效期哦
鄙人:(终究没能逃过套路)看来以后得常来呢,可是我这买的锅碗瓢盆一年都用不坏吧

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值