Spring框架中设计模式之 策略模式

在 Spring 中,策略模式主要应用在资源加载器(ResourceLoader)接口中。资源加载器用于加载资源,Spring 提供了多个资源加载器的实现类,如 ClassPathResourceLoader、FileSystemResourceLoader 等。这些实现类就是策略,将不同的资源加载方式适配到 ResourceLoader 接口中。

下面是一个使用策略模式的示例代码:

public interface Resource {
    InputStream getInputStream() throws IOException;
}

public interface ResourceLoader {
    Resource getResource(String location);
}

public class ClassPathResourceLoader implements ResourceLoader {
    private ClassLoader classLoader;

    public ClassPathResourceLoader() {
        this.classLoader = ClassUtils.getDefaultClassLoader();
    }

    public ClassPathResourceLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    @Override
    public Resource getResource(String location) {
        Assert.notNull(location, "Location must not be null");
        if (location.startsWith("/")) {
            location = location.substring(1);
        }
        return new ClassPathResource(location, this.classLoader);
    }
}

public class FileSystemResourceLoader implements ResourceLoader {
    private final String rootPath;

    public FileSystemResourceLoader() {
        this.rootPath = "";
    }

    public FileSystemResourceLoader(String rootPath) {
        Assert.notNull(rootPath, "Root path must not be null");
        this.rootPath = rootPath;
    }

    @Override
    public Resource getResource(String location) {
        Assert.notNull(location, "Location must not be null");
        String path = StringUtils.applyRelativePath(this.rootPath, location);
        return new FileSystemResource(path);
    }
}

public static void main(String[] args) throws IOException {
    ResourceLoader loader = new ClassPathResourceLoader();
    Resource resource = loader.getResource("spring.xml");
    System.out.println(resource.getInputStream().available());

    loader = new FileSystemResourceLoader();
    resource = loader.getResource("/Users/username/spring.xml");
    System.out.println(resource.getInputStream().available());
}

在上面的代码中,Resource 是一个资源加载器返回的资源对象接口,ResourceLoader 是资源加载器接口。
ClassPathResourceLoader 和 FileSystemResourceLoader 都是 ResourceLoader 接口的实现类,分别用于从类路径和文件系统中加载资源。
这些实现类将不同的资源加载方式适配到 getResource 方法中。在 main 方法中,我们通过 ClassPathResourceLoader 和 FileSystemResourceLoader 来加载 spring.xml 文件,并输出了其输入流的可用字节数。这样,使用不同的 ResourceLoader 就可以根据不同的资源类型选择不同的加载方式,从而实现了策略模式的应用。