专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
Java编程精选  ·  因“过于痴迷”AI,50+岁程序员被公司开除 ... ·  17 小时前  
芋道源码  ·  5.6K ... ·  昨天  
芋道源码  ·  手把手教你实现一个Java Agent ·  昨天  
Java编程精选  ·  字节员工爆料:快40岁了,每天晚上加班到12 ... ·  2 天前  
芋道源码  ·  2W字全面剖析 Mybatis 中的9种设计模式 ·  3 天前  
51好读  ›  专栏  ›  芋道源码

Spring项目中用了这种模式,经理对我刮目相看

芋道源码  · 公众号  · Java  · 2025-06-15 18:57

正文

请到「今天看啥」查看全文


  • 总结

  • 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 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) {
        ..
        
        






    请到「今天看啥」查看全文