Java設計模式之策略模式、模板模式
阿新 • • 發佈:2020-08-23
對於業務程式碼中有多個if時,可以採用策略模式,將多個if裡的演算法封裝為多個處理器(handler),再通過工廠方法去獲取相應的處理器。
如果if裡的演算法有共同特徵,提取為抽象方法,handler去繼承實現。
/** * 打折模板 * @author XinHai.Ma * */ public class Discount { /** * 打折方法 * @return */ public String discount() { return null; } }
/** * 初級會員打折策略 * @authorXinHai.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); } }