黑马程序员技术交流社区

标题: 【西安校区】基于Springboot注解的策略模式 [打印本页]

作者: 逆风TO    时间: 2020-1-8 11:01
标题: 【西安校区】基于Springboot注解的策略模式
释义

策略模式和多态很相似

可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。

实现

上代码:

[JavaScript] 纯文本查看 复制代码
public interface CalcStrategy {
   
    void calc(String ql);
   
}



定义几个实现类
[JavaScript] 纯文本查看 复制代码
@Service
public class HelloService implements CalcStrategy {
    @Override
    public void calc(String ql) throws SupportPortalException {
                System.out.println("hello : " + ql);
    }

}


[JavaScript] 纯文本查看 复制代码
@Service
public class WorldService implements CalcStrategy {
    @Override
    public void calc(String ql) throws SupportPortalException {
                System.out.println("world : " + ql);
    }

}


[JavaScript] 纯文本查看 复制代码
@Component
public class DataCalcStrategy {
    @Autowired
    private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>();

    public void calc(String type, String ql) {
        CalcStrategy calcService = calcStrategyMap.get(type);
        calcService.calc(ql);
    }
}


[JavaScript] 纯文本查看 复制代码
@Test
    public void contextLoads() throws SupportPortalException {

        dataCalcStrategy.calc("helloService", "666");
        dataCalcStrategy.calc("worldService", "777");
}


原理
@Autowired
在源码中写到

In case of a java.util.Collection or java.util.Map dependency type, the container will autowire all beans matching the declared value type. In case of a Map, the keys must be declared as type String and will be resolved to the corresponding bean names.

当Autowired注解在Collection 上时,会将所申明类的所有实现类都放在那个指定的Collection里;

如果Autowired和map使用的话呢,它将它bean的名称作为key,所有的bean作为value.

上面例子中
[JavaScript] 纯文本查看 复制代码
 @Autowired
    private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>();


会把所有实现了CalcStrategy接口的类,放入这个map中,key是这些实现类bean的名称

[Pascal] 纯文本查看 复制代码
public void calc(String type, String ql) {
        CalcStrategy calcService = calcStrategyMap.get(type);
        calcService.calc(ql);
    }


这个方法会根据传进来的type(bean的名称),从map中取出具体实例,从而使用多态调用不同的方法。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2