Strategy Pattern策略模式

策略模式是指定義一組算法,將每個算法都封裝起來,使得它們之間可以互相替代。客戶端在使用這些算法的時候互不影響。

體現了面向對象設計原則:

1.封裝變化的概念

2.編程中使用接口,而不是對接口的實現

策略模式的組成:

1.抽象策略角色:策略類 通常是由一個接口或抽象類實現

2.具體策略角色:包裝了相關的算法和行爲

3.環境角色:持有一個策略的引用,最終給客戶端使用

下面是java代碼實現:

// 定義一個Strategy接口,其中定義一個方法,用於計算。
public interface Strategy{
	public int calculate(int a, int b);
}

// 定義具體的算法類,實現Strategy接口,算法類中的算法各自不同:加減乘等
public class AddStrategy implements Strategy{

    @Override
    public int calculate(int a, int b){        
        return a + b;
    }

}

public class SubtractStrategy implements Strategy{

    @Override
    public int calculate(int a, int b){
        return a - b;
    }

}

/*定義具體的環境角色,持有Strategy接口的引用,
並且有get和set方法可以完成策略更換。在環境角色中調用接口的方法完成動作。
*/
public class Environment{
    private Strategy strategy;

    public Environment(Strategy strategy){
        this.strategy = strategy;
    }

    public Strategy getStrategy(){
        return strategy;
    }

    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
    
    public int calculate(int a, int b){
        return strategy.calculate(a, b);
    }
}

// 這樣在Client外部調用時,只需向環境角色設置相應的算法類,然後就可以得到相應的結果。
public class Client{
    public static void main(String[] args){
        AddStrategy addStrategy = new AddStrategy();
        Environment environment = new Environment(addStrategy);        
        System.out.println(environment.calculate(4, 3));
        
        //減法
        SubtractStrategy subStrategy = new SubtractStrategy();
        environment.setStrategy(subStrategy);
        System.out.println(environment.calculate(4, 3));
        
        //乘法
        MultiplyStrategy multiplyStrategy = new MultiplyStrategy();
        environment.setStrategy(multiplyStrategy);
        System.out.println(environment.calculate(4, 3));
    }
}

優點:使開發者開發出由許多可替換部分組成的軟件,各個部分是弱連接關係

缺點:客戶端必須知道所有的策略類,並自己決定使用哪一個類

應用:電商購物支付的時候選擇所屬支付算法

發佈了54 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章