前言:
Android 的设计模式系列文章,欢迎star,持续更新。。。
定义:
定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。在不同环境下选择不同的策略来产生不同的结果。
实例:
- 算法,如果有个排序算法,我们可以选择:冒泡,直接,插入,快速 排序等
- 列表,如果有个列表需要显示,我们可以选择不同的adapter,比如 ArrayAdapter,SimpleAdapter,BaseAdapter等
- 插值器,
setInterpolator
() 如线性,非线性,先加速后减速,先减速后加速等 - 一道菜的做法有很多种:清蒸,爆炒,小炒
我今天就选用猪肉的做法来解释一下策略模式的结构,为什么选择猪肉呢?(贵)
时下是2019年,今天也是猪肉最贵的一年,瘦肉30一斤,排骨已经快到了35快40一斤了, 深深感觉到在大城市生活艰辛啊,小编觉得就快连猪肉都吃不起了呢,不如跟我一起吃鸡肉或者鱼肉吧,哈哈。再说现在瘟疫怎么那么多啊,时不时猪瘟,这疫情也太多了吧。前段时间差点就和老朋友一起回去干养殖业去了,老家很多人因为猪瘟的传播,赚了一大笔,因为他们养几万只鸡,卖的可好了。主要还是因为有抖音这个大平台,用得妥当,确实有不菲的收入。
好吧,吐槽完了,一起来看看策略模式下猪肉的做法吧。
代码:
/**
* 猪肉做法策略
*/
public interface PigMainStragety {
void pigAction();
}
/**
* 清蒸 猪肉
*/
public class SteamStragety implements PigMainStragety {
@Override
public void pigAction() {
System.out.println("调用清蒸的逻辑");
}
}
/**
* 小炒 猪肉
*/
public class FiredStragety implements PigMainStragety {
@Override
public void pigAction() {
System.out.println("调用小炒的逻辑");
}
}
/**
* 爆炒 猪肉
*/
public class StirFirStragety implements PigMainStragety {
@Override
public void pigAction() {
System.out.println("调用爆炒的逻辑");
}
}
public class PigMainImpl {
private PigMainStragety pigMainStragety;
public PigMainImpl(PigMainStragety pigMainStragety) {
this.pigMainStragety = pigMainStragety;
}
public void mainAction() {
pigMainStragety.pigAction();
}
}
public class ClienTest {
public static void main(String[] args) {
PigMainImpl pigMain;
//清蒸
pigMain = new PigMainImpl(new SteamStragety());
pigMain.mainAction();
//小炒
pigMain = new PigMainImpl(new FiredStragety());
pigMain.mainAction();
//爆炒
pigMain = new PigMainImpl(new StirFirStragety());
pigMain.mainAction();
}
}
应用场景:
- 同一个问题具有不同算法时,具体的实现细节不同
- 对客户隐藏具体策略(算法)的实现细节,彼此完全独立;提高算法的保密性与安全性
- 一个类拥有很多行为,而又需要使用if-else或者switch语句来选择具体行为时。使用策略模式把这些行为独立到具体的策略类中,可以避免多重选择的结构
优缺点:
- 策略类可以互相替换由于策略类都实现同一个接口,因此他们能够互相替换。
- 耦合度低,方便扩展增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合开闭
- 避免使用多重条件选择语句
- 策略的增多会导致子类的也会变多
- 户端必须知道所有的策略类,并自行决定使用哪一个策略类。