Java 策略模式(strategy)

导读:本篇文章讲解 Java 策略模式(strategy),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言:

问:啥是“策略”
答:不同情况不同处理呗
问:那不就是 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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16551.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!