美文网首页
策略模式

策略模式

作者: 那就省略号吧 | 来源:发表于2020-02-28 16:18 被阅读0次

    创建一个策略接口

    public interface FatherFactory{
      //获取一个标识,用来标识每个具体策略
        String getNo();
      //实现方法
        void method(Object object);
    }
    

    创建多个具体策略去继承接口

    @Component
    public class ChildFactoryA implements FatherFactory {
      //返回一个唯一编码,用来标识该具体策略
        @Override
        public String getNo() {
            return "编码1";
        }
    
        @Override
        public void  method(Object obejct) {
            ...
        }
    }
    
    @Component
    public class ChildFactoryA implements FatherFactory {
      //返回一个唯一编码,用来标识该具体策略
        @Override
        public String getNo() {
            return "编码1";
        }
    
        @Override
        public void  method(Object obejct) {
            ...
        }
    }
    

    创建一个管理类,用于管理上述策略,在服务启动时,将所有子工厂都初始化加入到map中,并以每个具体策略生成的唯一编码作为key,具体策略作为value,这样在使用的时候就能根据传入的编码获取对应的实现;

    @Component
    public class FactoryHandler {
        @Autowired
        private ApplicationContext applicationContext;
    
        private Map<String, FatherFactory> map = new HashMap<>();
        //该注解用于表示服务一启动就执行一下方法,并且只能执行一次
        @PostConstruct
        public void addFactory(){
            Map<String, FatherFactory> maps = applicationContext.getBeansOfType(FatherFactory.class);
            for (FatherFactory factory:maps.values()){
                map.put(factory.getBusinessRelateEnum().getValue(),factory);
            };
        }
    
        public FatherFactory getFactory(String businessCode){
            FatherFactory factory = map.get(businessCode);
            if (factory==null){
                throw new Exception();
            }
            return factory;
        }
    }
    

    调用实现方法,根据传入的编码,就能获得对应的具体策略,来实现不同的方法

    @Service
    public class FactoryService{
        @Autowired
        private FactoryHandler factoryHandler ;
    
        public void getThing(Object obejct) {
                    FatherFactory factory = factoryHandler.getFactory("编号");
                    factory.method(obejct);
        }
    

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/lpdlhhtx.html