案例:假如以快餐类为需求。模拟现实业务
方法一:简单工厂+策略模式(采用afterPropertiesSet方法)
//从这里可以看出使用了大量il/else,如果是真实业务//可能每个if/else中又有大量的业务逻辑这样就会显得代码很臃肿String type="";if (type.equals("炒饭")) {System.out.println("10块钱");} else if (type.equals("炒米粉")) {System.out.println("12块钱");} else if (type.equals("炒火腿")) {System.out.println("14块钱");} else if (type.equals("炒粉")) {System.out.println("16块钱");}}
/**
* @Author cgz* @Date /11/18 9:30*///注意需要继承这个InitializingBean或者实现类实现这个InitializingBean才会自动注入Bean//策略模式定义策略public interface Strategy extends InitializingBean{void getDecs();}//这里要让这个bean被扫描到才会自动注册到工厂里//如果需要afterPropertiesSet这个方法启动时久把该类存到内存中还需要加注解,不然spring默认是实例化该方法才会调用到@Service@Lazy(value=false)public class StrategyA implements Strategy{@Overridepublic String price(String type) {return "10";}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("炒饭",this);}}@Service@Lazy(value=false)public class StrategyB implements Strategy{@Overridepublic String price(String type) {return "12";}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("炒米粉",this);}}@Service@Lazy(value=false)public class StrategyC implements Strategy{@Overridepublic String price(String type) {return "14";}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("炒火腿",this);}}@Service@Lazy(value=false)public class StrategyD implements Strategy{@Overridepublic String price(String type) {return "16";}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("炒粉",this);}}
策略工厂
@Componentpublic class StrategyFactory {@Autowiredprivate static Map<String, Strategy> strategyMap = new HashMap<>();public static Strategy getInvokeStrategy(String username) {return strategyMap.get(username);}public static void register(String name, Strategy handler) {if (ObjectUtils.isEmpty(name) && handler == null) {return;}strategyMap.put(name, handler);}}
方法二:
* @Author cgz* @Date /11/18 9:30*/public interface Strategy {String price();}@Servicepublic class StrategyA implements Strategy{@Overridepublic String price(String type) {return "10";}}@Servicepublic class StrategyB implements Strategy{@Overridepublic String price(String type) {return "12";}}@Servicepublic class StrategyC implements Strategy{@Overridepublic String price(String type) {return "14";}}@Servicepublic class StrategyD implements Strategy{@Overridepublic String price(String type) {return "16";}}
策略工厂
@Componentpublic class StrategyFactory {@Autowiredprivate static Map<String, Strategy> strategyMap = new HashMap<>();public static Strategy getInvokeStrategy(String username) {return strategyMap.get(username);}//调用工厂得时候放入mapstatic {strategyMap.put("炒饭", new StrategyA());strategyMap.put("炒米粉",new StrategyB());strategyMap.put("炒火腿",new StrategyC());strategyMap.put("炒粉",new StrategyD());}}