使用策略模式來優化大量的if else
阿新 • • 發佈:2021-06-21
大量的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 { @Overridepublic 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();