一、什么是策略设计模式

  策略设计模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,而且使它们之间可以互相替换。策略模式让算法的变化不会影响到使用算法的客户。

  分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。

二、策略设计模式结构图

设计模式之 ==> 策略设计模式

这个类图并不复杂,右边是策略接口以及它的实现类,左边会有一个上下文,这个上下文会拥有一个策略,而具体这个策略是哪一种,我们是可以随意替换的

三、策略模式写法举例

我们需要实现这样一个功能:

  • 我们需要对一批不同格式的文件进行处理
  • 文件类型有 mp4,avi,rmvb,不同格式的文件使用不同的文件解析器来解析文件
  • 文件类型可不一定只有这几种,随着业务的扩展会不断增加, 比如 : txt, jpg,png等等

下面,我们使用策略设计模式来实现这个功能:

首先,先来定义一个文件类型的枚举和自定义的一个文件类,用于描述我们处理的文件类型

设计模式之 ==> 策略设计模式

public class MyFile {
    private FileType fileType;
    private String fileName;
    private String filePath;

    public MyFile(Builder builder) {
        this.fileType = builder.fileType;
        this.fileName = builder.fileName;
        this.filePath = builder.filePath;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private FileType fileType;
        private String fileName;
        private String filePath;

        public Builder fileType(FileType fileType) {
            this.fileType = fileType;
            return this;
        }

        public Builder fileName(String fileName) {
            this.fileName = fileName;
            return this;
        }

        public Builder filePath(String filePath) {
            this.filePath = filePath;
            return this;
        }

        public MyFile build() {
            return new MyFile(this);
        }
    }

    public FileType getFileType() {
        return fileType;
    }

    public String getFileName() {
        return fileName;
    }

    public String getFilePath() {
        return filePath;
    }

    @Override
    public String toString() {
        return "MyFile{" +
                "fileType=" + fileType +
                ", fileName='" + fileName + '\'' +
                ", filePath='" + filePath + '\'' +
                '}';
    }
}

MyFile