策略模式
这个模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换.
策略模式让算法独立于使用他的客户而独立变化的
使用场景
1 针对一类型问题有多种处理方式,仅仅是具体行为有差别
2 需要 安全的封装多种同一类的操作
3 出现同一抽象类有多个子类 而有需要使用 if-else 或者 switch-case 来选择具体的子类的时候
自己的理解
其实就是模块化的步枪 可以通过换枪管 发射不同的子弹
代码中 SubwayStrategy 就是枪管
TranficCalculator 就是枪
代码:
/**
* 价格计算器
*/
public class TranficCalculator {
private CalculateStrategy mStrategy;
public TranficCalculator(CalculateStrategy strategy) {
mStrategy = strategy;
}
public int getPrice(int km) {
return mStrategy.calculatePrice(km);
}
}
/**
* 计算接口
*/
public interface CalculateStrategy {
int calculatePrice(int km);
}
/**
* 公交车
*/
public class BusStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int fraction = extraTotal % 5;
int price = 1 + extraFactor * 1;
price = fraction > 0 ? ++price : price;
return price;
}
}
/**
* 地铁
*/
public class SubwayStrategy implements CalculateStrategy {
@Override
public int calculatePrice(int km) {
if (km < 6) {
return 3;
}
if (km < 12) {
return 4;
}
if (km < 22) {
return 5;
}
if (km < 32) {
return 6;
}
return 7;
}
}
使用:
public class MainActivity extends AppCompatActivity {
private EditText mMainEt;
private TranficCalculator calculator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calculator = new TranficCalculator(new SubwayStrategy());
mMainEt = findViewById(R.id.main_et);
findViewById(R.id.main_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String trim = mMainEt.getText().toString().trim();
int i = Integer.parseInt(trim);
int price = calculator.getPrice(i);
Log.e("text123", "onCreate: price = " + price);
}
});
}
}
具体代码地址:
网友评论