1. 程式人生 > 實用技巧 >Java設計模式之策略模式、模板模式

Java設計模式之策略模式、模板模式

對於業務程式碼中有多個if時,可以採用策略模式,將多個if裡的演算法封裝為多個處理器(handler),再通過工廠方法去獲取相應的處理器。

如果if裡的演算法有共同特徵,提取為抽象方法,handler去繼承實現。

/**
 * 打折模板
 * @author XinHai.Ma
 *
 */
public class Discount {

    /**
     * 打折方法
     * @return
     */
    public String discount() {
        return null;
    }

}

/**
 * 初級會員打折策略
 * @author
XinHai.Ma * */ public class PrimaryMember extends Discount { @Override public String discount() { return "0.8"; } }

/**
 * 中級會員打折策略
 * @author XinHai.Ma
 *
 */
public class IntermediateMember extends Discount {

    @Override
    public String discount() {
        return "0.7";
    }
}

/**
 * 高階會員打折策略
 * @author XinHai.Ma
 *
 */
public class AdvancedMember extends Discount {

    @Override
    public String discount() {
        return "0.6";
    }

}

import java.math.BigDecimal;

/**
 * 類描述: 價格類
 * @Author: XinHai.Ma
 * @Date: 2020/8/23 14:51
 */
public class Price {

    /**
     * 打折策略物件
     
*/ private Discount discount; public Price(Discount discount) { this.discount = discount; } /** * 計算價格 * @param amount * @param discount * @return */ public double calculation(String amount, String discount) { //原價 BigDecimal originalPrice = new BigDecimal(amount); //會員折扣 BigDecimal memberDiscount = new BigDecimal(discount); return originalPrice.multiply(memberDiscount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } }

/**
 * 類描述: 折扣工廠
 * @Author: XinHai.Ma
 * @Date: 2020/8/23 15:05
 */
public class DiscountFactory {

    private DiscountFactory() {}

    /**
     * 功能描述: 根據使用者等級獲取折扣
     * @Param: [member]
     * @Return: www.maxinhai.com.Discount
     * @Author: 15735400536
     * @Date: 2020/8/23 15:04
     */
    public static Discount getDiscount(String member) {
        Discount discount = null;
        switch (member) {
            case "普通會員":
                discount = new PrimaryMember();
            case "中級會員":
                discount = new IntermediateMember();
            case "高階會員":
                discount = new AdvancedMember();
        }
        return discount;
    }

}

public class PriceDemo {

    public static void main(String[] args) {

        Discount discount = DiscountFactory.getDiscount("中級會員");
        Price price = new Price(discount);
        String amount = "216.8";
        double calculation = price.calculation(amount, discount.discount());
        System.out.println("優惠折扣: " + discount.discount());
        System.out.println("打折後價格: " + calculation);
    }

}