一個男人的設計模式:出行也要妥妥的(策略模式)

宅在家裏太久了,我想出門溜達溜達!

選擇出行方式:

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();

    }
}

如果後期需要新增出行方式,只需要實現對應的接口即可,出門的時候選擇對應的出行方式即可.

總結

策略模式:分別封裝行爲接口,實現算法族,超類裏放行爲接口對象,在子類裏具體設定行爲對象。原則就是:分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行爲算法的變化獨立於算法的使用者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章