策略模式+工厂模式优化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
原创粉丝点击