定义
策略模式是一个比较实用的设计模式,在开发的时候经常遇到一种情况就是实现一个功能有多种方式,,我们可以根据不同的情况去选择不同的策略完成这个功能,当前你可以写在一个类中,加入大量的if else去判断,但是这就属于硬编码了,每次改动都会修改,不符合开闭原则,因此我们需要使用策略模式去根据不同的场景有不同的实现方案
二、 责任链模式的使用场景
1.针对一类问题,有多种处理方式,但是仅仅具体行为有差异的时候
2.出现一类抽象类有多个子类,需要if else来选择某个子类
UML图
代码案例
package com.example.leak.Stragety;
interface CalculateStragety {
void price();
}
public class BusCalculateStragety implements CalculateStragety {
@Override
public void price() {
//开始大巴的算费标准 比如上车两块去哪里都一样
}
}
public class TaxiCalculateStragety implements CalculateStragety {
@Override
public void price() {
//开始计程车的收费标准 按公里数计算
}
}
public class Calcutate {
private CalculateStragety mCalculateStragety;
public void setCalculateStragety(CalculateStragety calculateStragety){
mCalculateStragety=calculateStragety;
}
public void calculate(){
mCalculateStragety.price();
}
}
public class Client {
private void startCalculate() {
TaxiCalculateStragety taxiCalculateStragety = new TaxiCalculateStragety();
// BusCalculateStragety busCalculateStragety = new BusCalculateStragety();
Calcutate calcutate = new Calcutate();
calcutate.setCalculateStragety(taxiCalculateStragety);
calcutate.calculate();
}
}
我们以交通费计算为例子,不同的交通方式可能收费不一样 ,如果策略模式就可以定一个抽象接口,子类有不同的实现,再定义一个计算的类,可以通过外边不同的传参数进行不同的计算策略
四、优缺点
1.优势
多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。
策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离
缺点
客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类
策略模式造成很多的策略类
六 状态模式与策略模式的差异
状态模式结构上跟策略模式非常接近 写法基本相同
但是状态模式更像是要去根据某种状态去做不同的事情 比如根据不同的状态去做是否可以转发数据,还是跳转到登录页面,因为要记录不同的状态所以很可能是单例,因为传入数据的地方可能不止一处地方。
策略模式更像是根据不同的情况去做一样的事情比如根据不同的车计算路费。