该模式是与具体的项目业务无关的设计模式
先看图:

定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。
策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
假设需求:我们现在需要一个图片加载框架,我们可以选择Glide、Fresco、ImageLoader、Picasso其中的一个,比如选择ImageLoader实现了图片加载,正当我们美滋滋地实现了这个功能的时候,突然有一天Boss让你把加载框架换成Glide,如果很多类都去调用了ImageLoader,那么就得一个一个地去替换,替换到怀疑人生,如果之前使用到策略模式,那么替换过程将会变得非常简单。
抽象策略角色:
public interface Strategy {
void showImage();
}
具体策略角色:
//Glide
public class GlideStrategy implements Strategy{
@Override
public void showImage() {
System.out.println("Glide ShowImage");
}
}
//Fresco
public class FrescoStrategy implements Strategy {
@Override
public void showImage() {
System.out.println("Fresco ShowImage");
}
}
//ImageLoader
public class ImageLoaderStrategy implements Strategy {
@Override
public void showImage() {
System.out.println("ImageLoader ShowImage");
}
}
//Picasso
public class PicassoStrategy implements Strategy {
@Override
public void showImage() {
System.out.println("Picasso ShowImage");
}
}
环境角色:
public class Context {
Strategy strategy;
private Context() {
//在这里切换让谁去加载图片
// strategy = new GlideStrategy();
// strategy = new PicassoStrategy();
// strategy = new FrescoStrategy();
strategy = new ImageLoaderStrategy();
}
public void loadImage() {
strategy.showImage();
}
public static Context getInstance() {
return InnerClass.context;
}
private static final class InnerClass {
private static Context context = new Context();
}
}
最后可以直接这么调用:
Context.getInstance().loadImage();
适用场景:
有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。
网友评论