1. 程式人生 > 其它 >使用策略模式來優化大量的if else

使用策略模式來優化大量的if else

  大量的if else組成的程式碼,維護性和擴充套件性較差,可以使用策略模式來進行優化。

抽象的處理類:

public abstract class AbstractHandler {
  public abstract void handle();
  public abstract String type();
}

  具體的幾個處理類:

@Component
public class FreeHandler extends AbstractHandler {
  
    @Override
    public void handle() {
        System.
out.println("免費使用者業務開始。。。"); } @Override public String type() { return "free"; } } @Component public class NormalHandler extends AbstractHandler { @Override public void handle() { System.out.println("普通會員業務開始。。。"); } @Override public String type() {
return "normal"; } } @Component public class HighHandler extends AbstractHandler { @Override public void handle() { System.out.println("高階會員業務開始。。。"); } @Override public String type() { return "high"; } } @Component public class SuperHandler extends AbstractHandler { @Override
public void handle() { System.out.println("超級會員業務開始。。。"); } @Override public String type() { return "super"; } }

  註冊和管理各業務處理類:

@Component
public class AbstractHandlerProcessor implements ApplicationContextAware {
  
  private ApplicationContext context;
  
  private Map<String, AbstractHandler> processorMap = new HashMap<>();
  
  public AbstractHandler choose(String type) {
    AbstractHandler handler = map.get(type);
    if(null == handler) {
      throw new Exception("不支援的type型別,聯絡管理員。。。")
    }
    return handler;
  }
  
  @PostConstruct
  public void register() {
    Map<String, AbstractHandler> handlerMap = context.getBeansOfType(AbstractHandler.class);
    for(AbstractHandler handler : handlerMap.values()) {
      processorMap.put(handler.type(),handler);
    }
  }
  
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.context=applicationContext;
  }
}

  測試資料:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=Application.class)// 指定spring-boot的啟動類
public class HandlerTest {

    @Autowired
    private AbstractHandlerProcessor chooser;

    @Test
    public void test() throws Exception{

        String type = "free";
        AbstractHandler handler = chooser.choose(type);
        handler.handle();
    }
}

  還可以使用註解的方式來實現:

@Autowired
private Map<String, AbstractHandler > registedHandlers;

  具體的處理類:

@Service("free")
public class FreeHandler extends AbstractHandler {
  
    @Override
    public void handle() {
        System.out.println("免費使用者業務開始。。。");
    }
}

  可以用registedHandlers來直接使用:

AbstractHandler  handler = registedHandlers.get("free");
handler.handle();