类别:结构型设计模式
目的:把同类的代码进行单独封装、使得需要使用这部分代码的用户可以按需使用
对用户上传的图片应用不同的压缩算法和滤镜
压缩算法:
滤镜:
public class HardCode { public static void main(String[] args) { var fileName = "test.jpg"; var compressor = "jpeg"; var filter = "blackAndWhite"; handleUpload(fileName, compressor, filter); } public static void handleUpload(String fileName, String compressor, String filter) { if (compressor.equals("jpeg")) { System.out.println("应用jpeg压缩算法..."); } else if (compressor.equals("png")) { System.out.println("应用png压缩算法..."); } if (filter.equals("blackAndWhite")) { System.out.println("应用blackAndWhite滤镜"); } else if (filter.equals("backgroundBlur")) { System.out.println("应用blackAndBlur滤镜"); } } } 复制代码
上面的代码分成两类,一类是压缩算法,另一类是滤镜算法
压缩算法接口
public interface Compressor { void apply(String fileName); } 复制代码
2个压缩算法的具体实现
public class JpegCompressor implements Compressor { @Override public void apply(String fileName) { System.out.println("应用jpeg压缩算法..."); } } public class PngCompressor implements Compressor { @Override public void apply(String fileName) { System.out.println("应用png压缩算法..."); } } 复制代码
滤镜算法
public interface Filter { void apply(String fileName); } 复制代码
2个滤镜算法的具体实现
public class BlackAndWhiteFilter implements Filter { @Override public void apply(String fileName) { System.out.println("应用blackAndWhite滤镜"); } } public class BackgroundBlurFilter implements Filter { @Override public void apply(String fileName) { System.out.println("应用backgroundBur滤镜"); } } 复制代码
使用策略
public static void main(String[] args) { var fileName = "test.jpg"; var compressor = new JpegCompressor(); var filter = new BlackAndWhiteFilter(); handleUpload(fileName, compressor, filter); } public static void handleUpload(String fileName, Compressor compressor, Filter filter) { compressor.apply(fileName); filter.apply(fileName); } 复制代码
可以看到这里个策略模式把具体的算法实现单独抽离到独立的类中了,调用方流程更加清晰,同时,单独的具体算法实现类也更容易被复用了
每个策略的具体实现可以很复杂,通过封装,使得这部分复杂的代码保持了独立
策略对象由用户进行创建并传递到处理方法中: handleUpload(String fileName, Compressor compressor, Filter filter)