终极自定义接口实现!按需获取实现类&方法

  • 1、开始想弄一个根据不同的需求获得不同的实现类
  • 我依旧觉得不够过瘾,如果我的方法不够岂不是还要再加方法。于是我想到了它!。
  • 我以为这样就完了~
  • 思考
  • 1 之前的哥们说,用SpringBeanUtil这个帮助类的话,既不解耦也不依赖注入!!!
  • 2 如果我要传多个不同类型的参数呢?。总不能加很多个吧。很傻很天真;


1、开始想弄一个根据不同的需求获得不同的实现类

于是开始了寻找,终于在
这个哥哥的灵感下实现了他的思路
首先我们有一个接口!

public interface PortDataDealService {
      String deal(String data);
}

然后我们搞几个他的实现类
这里我只搞了一个,不过没有关系,跟着我的步伐,你搞几个都没关系。

public class P86 implements PortDataDealService {
    @Override
    public String deal(String data) {
        //TODO 这里插入你想实现的东西。
        return null;
    }
}

这时候就有了类和接口,接下来就是如何随心所欲的调你想要的接口了。
但是这时候我们需要一个帮助类-帮助我们获取实现类

public class SpringBeanUtil {
    /**
    根据名字获得 类实例
     * @param BeanId
     * @return
     */
    public static Object getBeanByName(String BeanId) {
        if (null == BeanId) {
            return null;
        }
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        assert wac != null;
        return wac.getBean(BeanId);
    }

    /**
    根据类型获得 类实例 
     * @param clazz
     * @return
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static Object getBeanByType(Class clazz) {
        if (null == clazz) {
            return null;
        }
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        assert wac != null;
        return wac.getBean(clazz);
    }
}

接下来就要用到我们这个接口了;

//这里强制转换成你要的接口,那么可以调用这个接口的方法。而你
PortDataDealService beanByName = (PortDataDealService) SpringBeanUtil.getBeanByName("P" 
//获取的是这个接口的实现类,这个type可以是类名。你可以根据你得到的参数设置实现类名
+ type);
			//调用方法
 beanByName.deal(string);

我依旧觉得不够过瘾,如果我的方法不够岂不是还要再加方法。于是我想到了它!。

接下来就来一个简简单单 的 重构,在我的接口加上 泛型。如下

/**
 * 
 * @param <R> 返回值
 * @param <P> 参数
 */
public interface PortDataDealService<R,P> {
      R deal(P data);
}

这样的话,就可以瞎玩了,想要什么参数就要什么参数;

只要把我的实现类稍稍改一下

public class P86 implements PortDataDealService<Integer,String> {
    @Override
    public Integer deal(String ... data) {
        //TODO 这里插入你想实现的东西。
        return null;
    }

而我们的调用。不需要做任何改变 还是这样

PortDataDealService beanByName = (PortDataDealService) SpringBeanUtil.getBeanByName("P" 
+ type);
			//调用方法
 beanByName.deal(string);

我以为这样就完了~

我突然想到。如果我需要多参呢 我想到了它 ( … )

我现在去看看怎么用

看起来很简单,稍稍修改了一下 接口和实现类
看接口

/**
 *
 * @param <R>
 * @param <P>
 */
public interface PortDataDealService<R,P> {
      R deal(P ... data);
}

看实现类

public class P86 implements PortDataDealService<Integer,String> {
    @Override
    public Integer deal(String ... data) {
        //TODO 这里插入你想实现的东西。
        return null;
    }

我的调用依旧没有变过~~~~

思考

1 之前的哥们说,用SpringBeanUtil这个帮助类的话,既不解耦也不依赖注入!!!
2 如果我要传多个不同类型的参数呢?。总不能加很多个吧。很傻很天真;