SPRING策略模式

应用场景:当你对外发布一支接口,功能是根据一个入参类型走不同分支,并且每个分支逻辑都很复杂,但如果你用

if(type == 1){
...
}else if(type == 2){
...
}else{
...
}

会比较丑陋,且不利于扩展。

此时策略模式模式就诞生了。


定义一个接口类BaseEventService,每个分支就写一个实现类,最后通过策略类EventStrategyService来作为入口。

案例如下:


接口类:BaseEventService

public interface BaseEventService {
    int getType();
    void doEvent();
}

实现类1:SaveEventService

@Service
public class SaveEventService implements BaseEventService {
    @Override
    public int getType() {
        return 0;
    }
    @Override
    public void doEvent() {
        System.out.println("===save===");
    }
}

实现类2:UpdateEventService

@Service
public class UpdateEventService implements BaseEventService {
    @Override
    public int getType() {
        return 1;
    }
    @Override
    public void doEvent() {
        System.out.println("===update===");
    }
}

策略类:EventStrategyService

@Service
public class EventStrategyService implements InitializingBean {
    @Autowired
    private Set<BaseEventService> serviceList;
    private HashMap<Integer,BaseEventService> map = new HashMap<>();
    public void doEvent(int type){
        BaseEventService s = map.get(type);
        s.doEvent();
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        for (BaseEventService s : serviceList) {
            map.put(s.getType(), s);
        }
    }
}

显而易见,Controller通过注入EventStrategyService,并且调用doEvent(int type)可以使得调用不同实现类

{context}