正文
不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用
if else
去做判断,比如类型等于JSON,我就用JSON解析器,那如果新加一个类型的解析器,是不是调用的客户端还要修改呢?这显然太耦合了,本文就介绍一种方法,服务定位模式
Service Locator Pattern
来解决,它帮助我们消除紧耦合实现及其依赖性,并提出将服务与其具体类解耦。
我们通过一个例子来告诉你如何使用
Service Locator Pattern
。
假设我们有一个从各种来源获取数据的应用程序,我们必须解析不同类型的文件,比如解析CSV文件和JSON文件。
1、定义一个类型的枚举
public enum ContentType {
JSON,
CSV
}
2、定义一个解析的接口
public interface Parser {
List parse(Reader r);
}
3、根据不同的文件类型有不同的实现类
// 解析csv
@Component
public class CSVParser implements Parser {
@Override
public List parse(Reader r) { .. }
}
// 解析json
@Component
public class JSONParser implements Parser {
@Override
public List parse(Reader r) { .. }
}
4、最后写一个调用的客户端,通过
switch case
根据不同的类型调用不同的实现
@Service
public class Client {
private Parser csvParser, jsonParser;
@Autowired
public Client(Parser csvParser, Parser jsonParser) {
this.csvParser = csvParser;
this.jsonParser = jsonParser;
}
public List getAll(ContentType contentType) {
..