策略模式实现

本文介绍了如何使用策略模式优化Java代码,通过定义公共接口和具体实现类,将不同类型逻辑封装在不同的策略中,提高代码可读性和维护性。Spring容器被用来管理这些策略对象并动态调用相应的方法。
摘要由CSDN通过智能技术生成

针对多类型,逻辑处理,用if else 代码可读性,拓展性都比较差,可以使用策略模式处理,对不同类型单独做逻辑处理,下面是代码实现
1.先定义一个公共接口–抽象策略

public interface HandleStrategy {

    /**
     * 定义选择的key类型
     *
     */
    String getKey();

    /**
     * 处理方法
     * @param parameter 请求参数
     */
    void handleMethod(String parameter);
}

2.创建实现类,实现公共接口–具体策略(需要加上@Component,将处理方法注册到spring容器中)

@Component
public class OneHandleService implements HandleStrategy {
    //可以用枚举替代
    private final String key = "1";

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public void handleMethod(String parameter) {
        System.out.println("OneHandleService:" + parameter);
    }
}
@Component
public class TwoHandleService implements HandleStrategy {
    //可以用枚举替代
    private final String key = "2";

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public void handleMethod(String parameter) {
        System.out.println("TwoHandleService:" + parameter);
    }
}

3.创建策略容器类,获取所有策略用map收集,对不同策略进行调用

@Component
public class HandleContext implements ApplicationContextAware {

    private ConcurrentHashMap<String, HandleStrategy> HandleStrategyMap = new ConcurrentHashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 获取HandleStrategy的所有bean对象
        Map<String, HandleStrategy> beansOfType = applicationContext.getBeansOfType(HandleStrategy.class);
        beansOfType.values().stream().forEach(item -> {
            HandleStrategyMap.put(item.getKey(), item);
        });
    }

    /**
     * 根据map值获取对象的HandleStrategy对象,然后调用HandleStrategy对象的处理方法
     *
     * @param key
     * @param parameter
     */
    public void resolve(String key, String parameter) {
        HandleStrategy handleData = HandleStrategyMap.get(key);
        handleData.handleMethod(parameter);
    }
}

执行测试结果:

    @Test
    public void testHandle(){
        HandleContext.resolve("2","2");
        //输出
        //TwoHandleService:2
    }
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值