前言:
問:啥是“策略”
答:不同情況不同處理唄
問:那不就是 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) {
return 0.95 * money;
}
}
//超級會員
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
鄙人:可以
收銀妹子:歡迎下次光臨,溫馨提示您呢,超級會員只有一年的有效期哦
鄙人:(終究沒能逃過套路)看來以後得常來呢,可是我這買的鍋碗瓢盆一年都用不壞吧