#### 前言: ####
问:啥是“策略”
答:不同情况不同处理呗
问:那不就是 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
鄙人:可以
收银妹子:欢迎下次光临,温馨提示您呢,超级会员只有一年的有效期哦
鄙人:(终究没能逃过套路)看来以后得常来呢,可是我这买的锅碗瓢盆一年都用不坏吧