1/24 设计模式之策略设计模式 Strategy Pattern
发布于 2022年 01月 11日 01:34
类别:行为型设计模式
目的:把同类的代码进行单独封装、使得需要使用这部分代码的用户可以按需使用
典型场景
对用户上传的图片应用不同的压缩算法和滤镜
压缩算法:
- jpeg格式
- png格式
滤镜:
- blackAndWhite滤镜
- backgroundBlur滤镜
硬编码
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);
}
UML
为什么策略模式更好
可以看到这里个策略模式把具体的算法实现单独抽离到独立的类中了,调用方流程更加清晰,同时,单独的具体算法实现类也更容易被复用了
一些注意的点
每个策略的具体实现可以很复杂,通过封装,使得这部分复杂的代码保持了独立
策略对象由用户进行创建并传递到处理方法中: handleUpload(String fileName, Compressor compressor, Filter filter)