該模式是與具體的項(xiàng)目業(yè)務(wù)無關(guān)的設(shè)計(jì)模式
先看圖:
定義:
策略模式定義了一系列的算法,并將每一個算法封裝起來秘血,而且使它們還可以相互替換,策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
策略模式使這些算法在客戶端調(diào)用它們的時候能夠互不影響地變化晴音。
假設(shè)需求:我們現(xiàn)在需要一個圖片加載框架,我們可以選擇Glide缔杉、Fresco锤躁、ImageLoader、Picasso其中的一個或详,比如選擇ImageLoader實(shí)現(xiàn)了圖片加載系羞,正當(dāng)我們美滋滋地實(shí)現(xiàn)了這個功能的時候,突然有一天Boss讓你把加載框架換成Glide鸭叙,如果很多類都去調(diào)用了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");
}
}
環(huán)境角色:
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();
}
}
最后可以直接這么調(diào)用:
Context.getInstance().loadImage();
適用場景:
有幾種相似的行為宋下,或者說算法嗡善,客戶端需要動態(tài)地決定使用哪一種,那么可以使用策略模式学歧,將這些算法封裝起來供客戶端調(diào)用罩引。