策略模式是我们非常常用的一种模式,在没有接触到设计模式之前,代码里面有太多的if/else,switch了,当层级越多时,代码就显得越晦涩臃肿,可读性低,如果需求更新时那更是一种灾难。而策略模式能够极大的提高代码的逻辑。下面来看看策略模式究竟是什么东西。
我们在项目当中经常会遇到实现某一个功能可能会有多种算法实现或者策略的时候,例如说根据服务器的返回值选择不同的算法去计算结果,
//根据某个判断标准来选择不同的算法,出现大量的if/else结构或者switch结构,这样导致了过多的算法
或者实现都集中在同一个类中,这个类越庞大,维护或者修改起来就越艰难,这样就不符合设计的单一职责原则。
int result=0;
if(result==0){
//do something,在这里做具体的实现
}else if(result==1){
//do something
}else if(result==2){
//do something
}
//……
这种代码多了一来影响阅读,二来影响拓展,对于项目来说,这种类型的代码最好能够尽量重构一下。策略模式即是将这些算法或者策略单独的抽出来,提供一个接口,不同的算法有不同的实现,这样我们使用起来,就可以根据不同的实现对象来实现算法或策略。hexin2sixiang
举例子:
package com.djm.stragety;
/**
* 计算不同出行方式费用,可见在一个类里面写了三个计算算法(算法随便写的),如果往后需求多了,
* 增加了有轨电车的计算方式,那此类又将多一个算法,若再增加一种共享单车的出行方式,
* 此类会越来越庞大,维护和修改都将变得异常麻烦。
*/
public class Stragety {
/**出租车的费用*/
private float texiPrice(int km){
if(km<10){
return 2f;
}else if(km>10&&km<20){
return 2+km*0.3f;
}else{
return 2f+km*0.3f+(km-20)*0.2f;
}
}
/**公交的费用*/
private float busPrice(int km){
if(km<10){
return 2f;
}else{
return 5f;
}
}
/**地铁的费用*/
private float subwayPrice(int km){
if(km<=6){
return 3;
}else if(km>6&&km<12){
return 5;
}else if(km>12){
return 7;
}else{
return 9;
}
}
public static void main(String[] args){
Stragety stragety=new Stragety();
int result=0;
if(result==0){
stragety.busPrice(20);
}else if(result==1){
stragety.texiPrice(20);
}else if(result==2){
stragety.subwayPrice(10);
}
}}
我们可以定义一个计算出行方式的接口,不同的出行方式继承该接口去做具体的算法实现,如下:
public interface StragetyPrice {
float price(int km);
}
不同的出行方式做具体的实现:
/**地铁的具体计算算法*/
public class SubwayPrice implements StragetyPrice {
@Override
public float price(int km) {
if(km<=6){
return 3;
}else if(km>6&&km<12){
return 5;
}else if(km>12){
return 7;
}else{
return 9;
}
}
}
/**出租车的具体计算算法*/
public class TexiStragety implements StragetyPrice {
@Override
public float price(int km) {
if(km<10){
return 2f;
}else if(km>10&&km<20){
return 2+km*0.3f;
}else{
return 2f+km*0.3f+(km-20)*0.2f;
}
}
}
/**公交的具体计算算法*/
public class BusPrice implements StragetyPrice {
@Override
public float price(int km) {
if(km<10){
return 2f;
}else{
return 5f;
}
}
}
那么我们就将具体的算法抽离了出来,各个实现之间不相互耦合,以后每增加一种出行方式,就多加一个实现即可。
那么我们在调用时只需要做以下的判断即可,此时就完美的将具体的算法实现和调用分离了开来,需求变更或者维护起来也变得更加简单。
那么公交出行的计算器如下,同理,其他的出行方式使用也如下一样,这样就可以去掉了简化了各种if/else的判断,使得代码更加清晰易维护。
public class BusCaculator{
private StragetyPrice mStragety;
public void setStragety(Stragety stragety){
this.mStragety = stragety;
}
public void caculatePrice(int km){
mStragety.price(km);
}
public static void main(String[] args){
BusCaculator bus = new BusCaculator();
bus.setStragety(new BusPrice());
bus.caculatePrice(km);
}
}