策略模式
這個(gè)模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使他們還可以相互替換.
策略模式讓算法獨(dú)立于使用他的客戶而獨(dú)立變化的
使用場(chǎng)景
1 針對(duì)一類型問題有多種處理方式,僅僅是具體行為有差別
2 需要 安全的封裝多種同一類的操作
3 出現(xiàn)同一抽象類有多個(gè)子類 而有需要使用 if-else 或者 switch-case 來選擇具體的子類的時(shí)候
自己的理解
其實(shí)就是模塊化的步槍 可以通過換槍管 發(fā)射不同的子彈
代碼中 SubwayStrategy 就是槍管
TranficCalculator 就是槍
代碼:
/**
* 價(jià)格計(jì)算器
*/
public class TranficCalculator {
private CalculateStrategy mStrategy;
public TranficCalculator(CalculateStrategy strategy) {
mStrategy = strategy;
}
public int getPrice(int km) {
return mStrategy.calculatePrice(km);
}
}
/**
* 計(jì)算接口
*/
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);
}
});
}
}
具體代碼地址: