策略模式+工厂模式优化if...else if...else if结构
来源:互联网 发布:巫师3和老滚5 知乎 编辑:程序博客网 时间:2024/06/11 01:28
首先,按照if...else if语句来实现打折商品的例子,代码如下:
public class Example { public Double calRecharge(Double charge ,RechargeTypeEnum type ){ if(type.equals(RechargeTypeEnum.E_BANK)){ return charge*0.85; }else if(type.equals(RechargeTypeEnum.BUSI_ACCOUNTS)){ return charge*0.90; }else if(type.equals(RechargeTypeEnum.MOBILE)){ return charge; }else if(type.equals(RechargeTypeEnum.CARD_RECHARGE)){ return charge+charge*0.01; }else{ return null; } } }
用策略+工厂模式优化:
枚举类:
package strategy; public enum RechargeTypeEnum { E_BANK(1, "网银"), BUSI_ACCOUNTS(2, "商户账号"), MOBILE(3,"手机卡充值"), CARD_RECHARGE(4,"充值卡"); private int value; private String description; private RechargeTypeEnum(int value, String description) { this.value = value; this.description = description; } public int value() { return value; } public String description() { return description; } public static RechargeTypeEnum valueOf(int value) { for(RechargeTypeEnum type : RechargeTypeEnum.values()) { if(type.value() == value) { return type; } } return null; }}策略接口:
package strategy.strategy; import strategy.RechargeTypeEnum; public interface Strategy { public Double calRecharge(Double charge ,RechargeTypeEnum type );}
策略具体实现类:
package strategy.strategy; import strategy.RechargeTypeEnum; public class EBankStrategy implements Strategy{ @Override public Double calRecharge(Double charge, RechargeTypeEnum type) { return charge*0.85; } }
package strategy.strategy; import strategy.RechargeTypeEnum; public class BusiAcctStrategy implements Strategy{ @Override public Double calRecharge(Double charge, RechargeTypeEnum type) { // TODO Auto-generated method stub return charge*0.90; } }
package strategy.strategy; import strategy.RechargeTypeEnum; public class MobileStrategy implements Strategy { @Override public Double calRecharge(Double charge, RechargeTypeEnum type) { // TODO Auto-generated method stub return charge; } }
package strategy.strategy; import strategy.RechargeTypeEnum; public class CardStrategy implements Strategy{ @Override public Double calRecharge(Double charge, RechargeTypeEnum type) { return charge+charge*0.01; } }
策略上下文:
package strategy.strategy; import strategy.RechargeTypeEnum; public class Context { private Strategy strategy; public Double calRecharge(Double charge, Integer type) { strategy = StrategyFactory.getInstance().creator(type); return strategy.calRecharge(charge, RechargeTypeEnum.valueOf(type)); } public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } }
工厂类:
package strategy.strategy; import java.util.HashMap;import java.util.Map; import strategy.RechargeTypeEnum; public class StrategyFactory { private static StrategyFactory factory = new StrategyFactory(); private StrategyFactory(){ } private static Map strategyMap = new HashMap<>(); static{ strategyMap.put(RechargeTypeEnum.E_BANK.value(), new EBankStrategy()); strategyMap.put(RechargeTypeEnum.BUSI_ACCOUNTS.value(), new BusiAcctStrategy()); strategyMap.put(RechargeTypeEnum.MOBILE.value(), new MobileStrategy()); strategyMap.put(RechargeTypeEnum.CARD_RECHARGE.value(), new CardStrategy()); } public Strategy creator(Integer type){ return strategyMap.get(type); } public static StrategyFactory getInstance(){ return factory; }}客户端类:
package strategy.strategy; import strategy.RechargeTypeEnum; public class Client { public static void main(String[] args) { Context context = new Context(); // 网银充值100 需要付多少 Double money = context.calRecharge(100D, RechargeTypeEnum.E_BANK.value()); System.out.println(money); // 商户账户充值100 需要付多少 Double money2 = context.calRecharge(100D, RechargeTypeEnum.BUSI_ACCOUNTS.value()); System.out.println(money2); // 手机充值100 需要付多少 Double money3 = context.calRecharge(100D, RechargeTypeEnum.MOBILE.value()); System.out.println(money3); // 充值卡充值100 需要付多少 Double money4 = context.calRecharge(100D, RechargeTypeEnum.CARD_RECHARGE.value()); System.out.println(money4); } }
85.0
90.0
100.0
101.0
从上面代码可以看出,策略模式把具体的算法封装到了具体策略角色内部,增强了可扩展性,隐蔽了实现细节;它替代继承来实现,避免了if- else这种不易维护的条件语句。当然我们也可以看到,策略模式由于独立策略实现,使得系统内增加了很多策略类;对客户端来说必须知道兜友哪些具体策略, 而且需要知道选择具体策略的条件。
1 0
- 策略模式+工厂模式优化if...else if...else if结构
- 策略模式+工厂模式优化if...else if...else if结构
- 策略模式:代替if-else-if
- Conditionals - if else 模式
- if, else if, else
- if else if else
- if (){}else if(){} else{}
- 设计模式之 if-else
- if;if else;if else if 循环结构的用法
- if-else选择结构
- if-else优化措施
- 关于if else优化
- if-else代码优化
- if,else优化
- if-else优化问题
- 策略模式+工厂方法 实现多分支操作(代替多个if else)
- 结合策略模式和HashMap摆脱if else
- C# 选择结构 if、if..else、if..elseif...else、switch
- PyCharm设置护眼背景色
- IntelliJ IDEA 导入 第三方jar包 图解
- startActivityForResult的使用
- Activity跳转切换动画
- 算法导论(problems 6-3 Young tableaus)
- 策略模式+工厂模式优化if...else if...else if结构
- Spring 3之MVC & Security简单整合开发(一)
- C#中DataSet类的使用
- poj 3624 01背包
- IIS 访问网站 错误消息 401.3
- APP切换语言
- android 软键盘显示与隐藏
- js断点调试心得
- Xtrabackup怎么工作的