随笔 - 424  文章 - 0  评论 - 13  阅读 - 90万

使用策略模式来优化大量的if else

  大量的if else组成的代码,维护性和扩展性较差,可以使用策略模式来进行优化。

 

       抽象的处理类:

1
2
3
4
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();

 

posted on   lnlvinso  阅读(403)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示