本文共 3084 字,大约阅读时间需要 10 分钟。
public interface Strategy { public double calRecharge(Double charge,RechargeTypeEnum rechargeTypeEnum);}
public class StrategyFactory { private static StrategyFactory factory = new StrategyFactory(); private StrategyFactory(){ } private static HashMapstrategyMap = new HashMap<>(); static { strategyMap.put(RechargeTypeEnum.E_BANK.value(),new EBankStrategy()); strategyMap.put(RechargeTypeEnum.BUSI_ACCOUNTS.value(),new BusiAcctStrategy()); } // 单例模式 public Strategy create(Integer type){ return strategyMap.get(type); } public static StrategyFactory getInstance(){ return factory; }}
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; }}
public class EBankStrategy implements Strategy { @Override public double calRecharge(Double charge, RechargeTypeEnum rechargeTypeEnum) { return 0.85*charge; }}public class BusiAcctStrategy implements Strategy { @Override public double calRecharge(Double charge, RechargeTypeEnum rechargeTypeEnum) { return 0.75*charge; }}
public class Context { private Strategy strategy; public double calStrategy(Double charge,Integer type){ // 工厂方法 strategy = StrategyFactory.getInstance().create(type); return strategy.calRecharge(charge,RechargeTypeEnum.valueOf(type)); } public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; }}
public class Client { public static void main(String[] args) { Context context = new Context(); double money = context.calStrategy(1.0,1); System.out.println(money); }}
一个系统需要动态地在几种算法中选择一种,那么可以将这些算法封装到一个个的具体算法类中,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,根据“里氏代换原则”和面向对象的多态性,客户端可以选择使用任何一个具体算法类,并只需要维持一个数据类型是抽象算法类的对象。
一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句
不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法与相关的数据结构,可以提高算法的保密性与安全性
转载地址:http://bhiii.baihongyu.com/