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) {
        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

鄙人:可以
收銀妹子:歡迎下次光臨,溫馨提示您呢,超級會員只有一年的有效期哦
鄙人:(終究沒能逃過套路)看來以後得常來呢,可是我這買的鍋碗瓢盆一年都用不壞吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章