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);
}
}