美文网首页
策略模式

策略模式

作者: 那就省略号吧 | 来源:发表于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