4、优雅的策略方式处理不同的方法

1、策略的抽象类

在实际的开发中,经常有同一类事件需要进行处理,但是这类事件不同情况,方法的入参和返回值可能不一样,就是不能用同一个抽象方法进行处理。

下面的抽象类中,有方法aaa和bbb,不同情况需要不同的处理方法。


public abstract class AbstractHandler {

    abstract String supportType();

    protected void aaa(String name) {
        throw new UnsupportedOperationException();
    }

    protected String bbb(String name, int status) {
        throw new UnsupportedOperationException();
    }
}

2、注册实现了抽象方法的实际处理类


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class Factory implements ApplicationContextAware {
    private static final Map<String, AbstractHandler> FACTORY_MAP = new ConcurrentHashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, AbstractHandler> beanMap = applicationContext.getBeansOfType(AbstractHandler.class);
        beanMap.forEach((key, value) -> FACTORY_MAP.put(value.supportType(), value));
    }

    public static <T extends AbstractHandler> T getHandler(String name) {
        return (T) FACTORY_MAP.get(name);
    }
}

3、不同的处理器

比如一件事,需要有张三、李四进行处理,但是不同人可能处理的方法不一样。


public class ZhangsanHandler extends AbstractHandler {
    @Override
    String supportType() {
        return "zhangsan";
    }

    @Override
    public void aaa(String name) {
        System.out.println("张三完成的任务,名字是:" + name);
    }

}


public class LisiHandler extends AbstractHandler {
    @Override
    String supportType() {
        return "lisi";
    }

    @Override
    public void aaa(String name) {
        System.out.println("李四完成任务,名字是:" + name);
    }

    @Override
    public String bbb(String name, int status) {
        return "李四的任务是:" + name + ",状态是:" + status;
    }
}


public class WangwuHandler extends AbstractHandler {
    @Override
    String supportType() {
        return "lisi";
    }

    @Override
    public String bbb(String name, int status) {
        return "王五的任务是:" + name + ",状态是:" + status;
    }
}

4、测试类

public class ClientTest {

    public void test() {
        ZhangsanHandler zhangsanHandler = Factory.getHandler("zhangsan");
        zhangsanHandler.aaa("任务1");

        LisiHandler lisiHandler = Factory.getHandler("lisi");
        lisiHandler.aaa("任务2");
        lisiHandler.bbb("任务2", 0);

        WangwuHandler wangwuHandler = Factory.getHandler("wangwu");
        wangwuHandler.aaa("任务2");
        wangwuHandler.bbb("任务2", 0);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值