宅在家裏太久了,我想出門溜達溜達!
選擇出行方式:
1.天氣挺好的,步行出門,慢慢悠悠美美噠!
2.騎上我心愛的小摩托,它永遠不會堵車!
3.今天要相親了,我要開着我的東風風神去壓壓場子!
…
傳統的選擇方案
使用if…else 或者switch case 選擇不同的方案,如下代碼
public class Method {
public static void main(String[] args) {
String method = "某種出行方式";
if("步行".equalsIgnoreCase(method)){
//todo
}else if("小摩托".equalsIgnoreCase(method)){
//todo
}else if("東風風神".equalsIgnoreCase(method)){
//todo
}else{
System.out.print("家裏蹲");
}
}
}
存在的問題
我有錢了,買了輛飛機,或者太空船,那麼這裏的出行方式的代碼就需要再次修改.這裏的出行方式和調用出行動作的對象緊密耦合
策略模式
定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換。
出行方式接口
public interface IStrategy {
public void travelMode();
}
出行實現:
public class Walk implements IStrategy{
@Override
public void travelMode() {
System.out.print("天氣挺好的,步行出門,慢慢悠悠美美噠!");
}
}
public class Motorcycle implements IStrategy{
@Override
public void travelMode() {
System.out.print("騎上我心愛的小摩托,它永遠不會堵車!");
}
}
public class DongfengFengshen implements IStrategy{
@Override
public void travelMode() {
System.out.print("今天要相親了,我要開着我的東風風神去壓壓場子!");
}
}
使用出行方式的人
public class AMan {
private IStrategy strategy;
public AMan(IStrategy strategy){
this.strategy = strategy;
}
public void travel(){
System.out.println("我要出門了:");
//根據strategy的具體實現類來選擇出行方式
strategy.travelMode();
}
//這裏定義set方法可以再運行是改變出行的行爲
public void setStrategy(IStrategy strategy){
this.strategy = strategy;
}
}
現在要出門了:
public class Application {
public static void main(String[] args) {
AMan aman = new AMan(new Walk());
aman.travel();
aman.setStrategy(new Motorcycle());
aman.travel();
aman.setStrategy(new DongfengFengshen());
aman.travel();
}
}
如果後期需要新增出行方式,只需要實現對應的接口即可,出門的時候選擇對應的出行方式即可.
總結
策略模式:分別封裝行爲接口,實現算法族,超類裏放行爲接口對象,在子類裏具體設定行爲對象。原則就是:分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行爲算法的變化獨立於算法的使用者。