設計模式:策略模式(Strategy)

轉自:http://blog.csdn.net/jungle_hello

定義

策略模式(Strategy)屬於對象行爲型設計模式,主要是定義一系列的算法,把這些算法一個個封裝成擁有共同接口的單獨的類,並且使它們之間可以互換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化。這裏的算法不要狹義的理解爲數據結構中算法,可以理解爲不同的業務處理方法。

這種做法會帶來什麼樣的好處呢?
它將算法的使用和算法本身分離,即將變化的具體算法封裝了起來,降低了代碼的耦合度,系統業務策略的更變僅需少量修改。
算法被提取出來,這樣可以使算法得到重用,這種情況還可以考慮使用享元模式來共享算法對象,來減少系統開銷(但要注意使用享元模式的建議條件)。

結構

先由定義來想象下它的結構吧:要使算法擁有共同的接口,這樣就要實現一個接口或者
一個抽象類出來才行。這樣基本上輪廓也就出來了,我們來看看吧:
策略模式由三個角色組成:
1) 算法使用環境角色(Context):算法被引用到這裏和一些其它的與環境有關的操作一起來完成任務。
2) 抽象策略角色(Strategy):規定了所有具體策略角色所需的接口。在java 它通常由接口或者抽象類來實現。
3) 具體策略角色(Concrete Strategy):實現了抽象策略角色定義的接口。

策略模式各個角色之間關係的類圖表示:
這裏寫圖片描述

策略模式的實現

//抽象策略--Strategy- 
public interface Calculate {
    //一個待實現方法  
    int calculate(int a,int b);
}
//具體策略角色--Concrete Strategy1
public class AddCalculate implements Calculate {

    @Override
    //接口方法具體實現之加法 
    public int calculate(int a, int b) {
        return a+b;
    }

}
//具體策略角色--Concrete Strategy2 
public class DivideCalculate implements Calculate{
    @Override
    //接口方法具體實現之除法 
    public int calculate(int a, int b) {
        return a/b;
    }
}
//算法使用環境角色--Context 
public class EnvironmentRole {
    private Calculate cal;
    //構造方法對變量完成賦值  
    public EnvironmentRole(Calculate cal)
    {
        this.cal = cal;
    }
    //獲得策略類對象 
    public Calculate getCalculate()
    {
        return cal;
    }
    //用set方法注入策略對象  
    public void setCalculate(Calculate cal)
    {
        this.cal = cal;
    }
    //環境角色中的接口方法,其具體結果依賴於策略引用指向的具體策略角色對象 
    public int calculate(int a,int b) {
        return cal.calculate(a, b);
    }
}
//一個客戶端演示  
public class Client {
    public static void main(String[] args)
    {
        Calculate add = new AddCalculate();
        EnvironmentRole environmentRole = new EnvironmentRole(add);
        System.out.println(environmentRole.calculate(3, 4));

        Calculate divide = new DivideCalculate();
        EnvironmentRole environment = new EnvironmentRole(divide);
        System.out.println(environment.calculate(9, 3));


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