1、定義
define a family of algorithms, encapsulate each one, and make them interchangeable.
定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。
2、使用場景
多個類只是在演算法或行為上稍有不同
演算法需要自由切換
需要遮蔽演算法規則
3、uml類圖
角色說明:
上下文context: 遮蔽高層模組對策略、演算法的直接訪問,它持有乙個strategy類的引用
抽象策略strategy:對策略、演算法進行抽象、
concretestrategya、concretestrategyb:是實現抽象策略中的具體操作,具體演算法。
4、示例
以圖書館售書折扣為例,存在以下三種折扣演算法:
演算法1:對有些圖書沒有折扣,即折扣值演算法中折扣值為0
演算法2:對有些圖書的折扣值是固定值為1元
演算法3:對有些圖書的折扣是15%
/**
* 抽象折扣演算法
* @author administrator
* */
public abstract class strategy
public double getprice()
public int getnumber()
// 策略演算法,計算折扣額
public abstract double calculatediscount();
}
/**
* 具體折扣類,沒有折扣演算法
* @author administrator
* */
public class nodiscountstrategy extends strategy
/*** 實現策略演算法,0折扣演算法
*/@override
public double calculatediscount()
}
/**
* 具體折扣類,固定折扣值為1的演算法
* @author administrator
* */
public class fixdiscountstrategy extends strategy
/*** 實現策略演算法,固定的折扣額
*/@override
public double calculatediscount()
}
/**
* 具體的折扣,按照15%的折扣演算法
* @author administrator
* */
public class percentagediscountstrategy extends strategy
/*** 具體策略演算法,15%的折扣額
*/@override
public double calculatediscount()
}
/**
* 上下文文context的實現
* @author administrator
* */
public class contextclient
/*** 呼叫策略演算法,計算折扣值
* @return
*/public double caldiscount()
public static void main(string args)
}
輸出結果如下:
0折扣:0.0
固定折扣:40.0
15%折扣:145.5
5、總結
優點:定義了乙個演算法和行為族,恰當的使用繼承將公共的**移到父類中,避免**重複。
避免使用多重條件判斷。
缺點:客戶端必須知道所有的策略類,並自行決定使用哪個策略類。
隨著策略的增加,子類也會變得繁多。
策略模式(行為型)
思考問題 乙個書店的某類書是免費的,某類書是固定1元的,某類書是按折扣算的 比如88 同一類別的書本 一樣 假定顧客只買一類書,在設計書店bookstore類時應該如何計算顧客買書的費用?解答 1.你有可能不知道如何設計,畢竟上面的計算規則不一樣 並不是一類書8折另一類書9折那樣好計算 2.既然這樣...
行為型 策略模式
注入物件,改變行為。這是乙個很有意思的模式,它可以有多種表現形式,只要滿足注入物件,改變行為。學習這個模式,必須忘記網上和書上的標準類圖。注入不同的comparator,排序的方式也不同。這是最常見的策略模式的表現形式,沒必要畫什麼圖。與上乙個策略模式比較,有點主客顛倒的意思。class beanc...
設計模式 行為型 策略模式
更好的實現開閉原則 ocp,openclosedprinciple 即對於擴充套件是開放的,對於修改是關閉的,不修改原有 只擴充套件 策略模式包括三個角色 context 環境類 使用演算法策略,維持乙個抽象策略類的引用例項 strategy 抽象策略類 將所有的策略抽象出來,在該類宣告抽象方法或者...